次のような状況があります。
@Entity
class A{
@Id
@SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
private Long aId;
@OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
private B b;
...
}
@Entity
class B{
@Id
private A a;
...
}
つまり、A と B の間には OneToOne の関連付けがあります。B は弱いエンティティであり、その Id はクラス A から派生しています。
この記事で言及されているように、 @OneToOne の下に @PrimaryKeyJoinColumn を追加して、いくつかのソリューションを既にテストしました。しかし、私はこのエラーを受け取りました: "org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): B"
この場合に関連するかどうかはわかりませんが、Oracle 11g を使用しています.
更新しました
私は正しい道を進んでいると思います。これが私の問題の実際の状態です:
@Entity
class A{
@Id
@SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
private Long aId;
@OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn(name="aId")
private B b;
...
}
@Entity
class B{
@Id
@OneToOne
@JoinColumn(name="aId)
private A a;
...
}
エラーは少し異なります。
java.sql.SQLException: ORA-00904: "B"."A": invalid identifier
テーブルBで(AIDではなく)列Aを見つけようとしています。列名がBAではなくB.AIDであることを指定する方法がわかりません