2017-09-15 1 views
1

子エンティティに持続カスケード接続しようとしているとき:PersistenceException私は2つの実体を持って

マスター:

@Entity 
@Table(name = "master") 
public class Master implements java.io.Serializable { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "seq") 
    private Integer seq; 

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name = "seq", referencedColumnName = "seq") 
    private SubMaster subMaster; 


    ................... 

} 

サブマスター:

@Entity 
@Table(name = "sub_master") 
public class SubMaster implements java.io.Serializable { 

    @Id 
    @Column(name = "seq") 
    private Integer seq; 

    private String subName; 


    ................... 

} 

、私は存続しようとしていますMasterエンティティSubMasterエンティティを設定すると、次のような例外が発生します。私はHibernateが親エンティティが永続化されると自動的に子エンティティを保持することを期待しています。

答えて

2

まず例外が発生したサブマスターのidだように思えるだけでなくサブマスターのための@GeneratedValue(戦略= IDENTITY)を追加。ソリューション

ようになりまし

は、JPAのバージョンによって異なります。

-2.0あなたの子実体を伝える場所が

@Entity 
@Table(name = "master") 
public class Master implements java.io.Serializable { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "seq") 
    private Integer seq; 

    @OneToOne(mappedBy = "master", cascade = CascadeType.ALL) 
    private SubMaster subMaster; 

} 

@Entity 
@Table(name = "sub_master") 
public class SubMaster implements java.io.Serializable { 

    @Id 
    @JoinColumn(name = "seq", referencedColumnName = "seq") 
    @OneToOne 
    private Master master; 

    private String subName; 

} 

のようなものを持っている可能性がありますので、関係の注釈に@Id注釈を定義することができます親のIDを取る

master.setSubMaster(subMaster); 
subMaster.setMaster(master) 

-1.0 @Idを基本アノテーションに配置しなければならないので、IDとリレーション列を区切る必要があるので、問題は、@GeneratedValueで最初に親を保存してから手動で設定することです

refを保存する前に、子供へのid:サブマスターIDの私は信じhttps://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

2

それは私がサブマスターは、@JoinColumnアノテーションを持つべきであると信じてあなたが組合の所有者を反転し、すべての

+0

をだが、修士と同じでなければなりません。しかし、私はこれを使用する場合、私は例外を取得している(私は明らかだと思います): 'java.sql.SQLException:フィールド 'seq'はデフォルト値を持たない' – gschambial

+0

同じidを持つ点どちらも ? OneToOneは外部キー参照を生成します。マスターIDと結合したい場合は、結合する2番目の列を指定し、sub_masterクラスにid_master属性を追加する必要があります。 さらに、seq要素のヌルエントリを無効にすることができます(これは例外の原因となる可能性があります) – alexay68

関連する問題