2017-09-15 71 views
1

我有2個實體:的PersistenceException試圖級聯堅持子實體

站長:

@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實體,我越來越追隨excep重複:

javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned beforeQuery calling save(): SubMaster 

而我期待,休眠它會自動堅持子實體,只要父實體持久。

回答

2

首先你倒協會的所有者母模的ID,因爲我相信副版應該有@JoinColumn註解。

現在

爲解決

取決於JPA版本:

-2.0你可以在relation批註定義@Id註釋,所以你可以有類似

@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; 

} 

,你告訴你的孩子實體取父母的編號

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

-1.0因爲你被迫將@Id放在一個基本的註釋上,所以你需要將一個id和一個關係列分開,問題在於,你必須先保存父項,然後手動設置該ID給孩子節省

裁判面前:https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

2

添加@GeneratedValue(策略= IDENTITY)爲副版爲好,好像它是產生異常

+0

但是,我相信副版ID應該是一樣的碩士學位。但是,如果我使用這個,我得到異常(我認爲是顯而易見的):'java.sql.SQLException:字段'seq'沒有默認值' – gschambial

+0

什麼是具有相同的ID爲兩個? OneToOne將生成一個外鍵引用。如果您也想加入Master ID,則需要指定要加入的第二列,並在您的sub_master類中添加一個id_master屬性。 此外,由於連接,您可以禁用seq元素的空條目(它可能是異常的來源) – alexay68