2017-06-20 43 views
0

我想解決瞬態對象異常而不添加級聯= CascadeType.ALL。一開始,這裏是我的實體。第一個是Person.java避免瞬態.TransientPropertyValueException而不使用級聯= Cascade.ALL

public class Person implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 
@ManyToOne 
//(cascade = CascadeType.ALL) 
private Address address; 
--------- 
} 

地址具有在數據的基礎上( 「標籤」=美國, 「標籤」=加拿大)只是兩個元素。這是一個數據存儲庫。在這之前,每件事都是好的,但是這個問題從這兩個實體開始。

這是我的實體合同

public class Contract implements Serializable{ 

private static final long serialVersionUID = 1L;  
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 

private int id; 

@ManyToOne(cascade =CascadeType.ALL) 
private Person person; 
} 

最後也是最重要的實體Company.java

public class Company implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    private Contract contract; 
    } 

這裏的問題是,當我想創建一家公司出現此錯誤:

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing 

你們中的一些人會告訴我添加Cascade = CascadeType.ALL之前私人地址地址,但我不想這樣做,因爲地址是一個數據存儲庫,我不想堅持它,我可以做所有事情級聯複用堅持。

謝謝你的幫助。

回答

0

如果Address對象實際上是數據庫中的靜態數據,那麼您必須先查找它們,然後將它們分配給它們各自的Person對象。你不能只填充數據並分配它們。

Address usaAddress = em.createTypedQuery("select a from Address where label = 'USA'", Address.class) 
         .getSingleResult(); 

    Person usaPerson = new Person(); 
    usaPerson.setAddress(usaAddress); 
    ... 

JPA就會知道,它並不需要再次堅持了usaAddress,除非你做一些事情來改變它的狀態。

0

該解決方案很容易我剛添加@瞬變註釋