質問

次のような状況があります。

@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;
  ....
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top