2012-02-25 148 views
7

我有一個關於休眠的一般問題,我打電話。休眠級聯PERSIST

我有A類和B類,B是依賴於

在我的代碼,當我打電話em.persist(objOfTypeA)我希望插入去,並插入到兩個表AAA和BBB。如果我手動設置A獲得A的ID並將其填充到每個對象的列表中,然後保留該列表,那麼事情就會起作用。 但我希望這發生在Hibernate的神奇

我做錯了什麼? 或者我只是期待太多的Hibernate?

感謝

@Entity 
@Table(name = "AAA") 
@Veto 
public class A { 

    @Id 
    @GeneratedValue 
    @Column(name = "Id") 
    private Long id; 


    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    ... 

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
    private List<B> b; 
... 
} 

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId") 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false) 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

回答

1

我終於搞定了。 無我被賦予或發現的例子告訴我到底什麼是錯的,這是隻有在我自己的實驗,我成功地得出這樣的結論:

,而不必

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
private List<B> b; 

這沒」將不起作用(FK仍然爲NULL來)

該做的工作:

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
@JoinColumn(name="AId") 
@NotNull 
private List<B> b; 
+0

這不適合我。問題在於Hibernate希望在持久化之前將A設置在B上。這工作:http://stackoverflow.com/questions/1795649/jpa-persisting-a-one-to-many-relationship – 2016-01-11 03:48:01

0

修改B如下類的映射,

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId", updatable = false, insertable = false) 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id") 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

你用在錯誤的地方屬性updatable = false, insertable = false,我已經改正了。

閱讀here瞭解它們是如何工作的。

+0

嗨ManuPK, 謝謝您回答,但這並沒有解決我的問題。 雖然試圖堅持(A)我得到一個錯誤,aId B爲空。 ConstraintViolationImpl {interpolatedMessage ='may not be null',propertyPath = aId,rootBeanClass = class com.test.model.B,messageTemplate ='{javax.validation.constraints.NotNull.message}'} 我不確定如果在SQL Server端,我必須將id(A和B)作爲標識,否則Hibernate會處理這個問題?但我認爲沒關係,因爲它沒有抱怨它在FK上抱怨。 – WonkeyDonkey 2012-02-26 12:44:05

+0

DB正在尋找這樣的: 表1:AAA 標識BIGINT NOT NULL, 名稱爲varchar(100) 表2:BBB 標識BIGINT NOT NULL, 援助BIGINT NOT NULL, 名稱爲varchar(100) 謝謝! – WonkeyDonkey 2012-02-26 12:44:40

+0

我回到數據庫並從AId中刪除'not null',並從B類中的aId中刪除了 @NotNull。現在堅持是成功的但是當我看着數據庫。 AAA是好的,但BBB缺少AId。 幫助.. – WonkeyDonkey 2012-02-26 13:01:34