次の簡略化されたセットアップを機能させることができません。条件APIを使用して1つのクラスのテーブルの2つの値を取得したいだけです。@OneToOneまたは@OneToManyなどで2つのクラスを使用したくありません。
これは可能ですか?そのようなことはJPAでは意図されていませんか?
最初の表:
test.table_1(
id integer,
value_1 text,
table_2_id integer
)
2番目の表:
test.table_2(
id integer,
value_2 text
)
エンティティクラス:
@Entity
@Table(schema = "test", name = "table_1")
@SecondaryTable(schema = "test", name = "table_2", pkJoinColumns = {
@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "table_2_id")
})
public class JointEntity {
@Id
private Integer id;
@Column(name = "value_1")
private String value1;
@Column(name = "value_2", table = "table_2")
private String value2;
// getter and setter
}
実行時にスローされる例外:
Exception in thread "main" org.hibernate.cfg.RecoverableException: Unable to find column with logical name: table_2_id in org.hibernate.mapping.Table(test.table_1) and its related supertables and secondary tables
at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:831)
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:608)
at org.hibernate.cfg.annotations.EntityBinder.bindJoinToPersistentClass(EntityBinder.java:794)
at org.hibernate.cfg.annotations.EntityBinder.createPrimaryColumnsToSecondaryTable(EntityBinder.java:786)
at org.hibernate.cfg.annotations.EntityBinder.finalSecondaryTableBinding(EntityBinder.java:714)
at org.hibernate.cfg.SecondaryTableSecondPass.doSecondPass(SecondaryTableSecondPass.java:29)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1586)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at de.icybits.test.HibernatePerformanceTest.main(HibernatePerformanceTest.java:18)
Caused by: org.hibernate.MappingException: Unable to find column with logical name: table_2_id in org.hibernate.mapping.Table(test.table_1) and its related supertables and secondary tables
at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:826)
... 14 more
彼の称賛で言及されたビリーフロストのように、@ SecundaryTableはこのように使用されることを意図していません。それで私はさらに調査をしました。ビリーフロストのコメントが私の質問に完全に答えていないからです。
これに対する答えは「はい」です。他の質問で回避策を見つけました。休止状態-エンティティ全体ではなく、単一の列のみに結合します
1.で述べたように、これは単なる回避策です。一般に、単一の外部列をエンティティに関連付けることだけを目的としたものではありません。(私はこれを100%確信しているわけではありませんが、さらに調査した結果、それが私が結論付けたものです。)
最後に、ビリー・フロストの素早いコメントに感謝します。このため、私は@SecundaryTableを調査から除外し、より良い答えを見つけることができました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加