Hibernate 3 で派生 ID をマッピングするにはどうすればよいですか?
-
26-09-2019 - |
質問
次のような状況があります。
@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:このクラスの ID は、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 を検索しようとしています。列名が B.A ではなく B.AID であることを指定する方法がわかりません。
解決
これに従って問題を解決しました リンク
正しい答えは次のようになります。
@Entity
public class A {
@Id
@GeneratedValue
@Column(name = "aId")
private Long id;
@OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a")
private B b;
...
}
@Entity
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")})
public class B {
@Id
@GeneratedValue(generator = "a-primarykey")
@Column(name = "aId")
private Long id;
@OneToOne
@PrimaryKeyJoinColumn
private A a;
...
}
他のヒント
エンティティ B でこれを試しましたか?
@Entity class B {
@Id @OneToOne
@JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
private A a;
....
}
所属していません StackOverflow