[英]Spring JPA ManyToOne - Save the transient instance before flushing
我創建了一個具有數據庫訪問權限的Spring Web Application
。 我有一個類Person
- 它引用了一個類Address
。 person
和company
都有Address
,因此person
和company
都參考Address
表。 我通過定義從個人到地址以及公司的@ManyToOne
關系來做到這一點。
@ManyToOne
@JoinColumn (name="COMPANY_ID")
private Adress companyId;
@ManyToOne
@JoinColumn (name="SUBSIDIARY_ID")
private Adress subsidiaryId;
在個人存儲庫中,我有一個像這樣的保存方法:
public Person save(Person entity) {
SaveAccess<Person> ao = createSaveAccess();
ao.setEntity(entity);
ao.execute();
return ao.getResult();
}
問題是,如果我嘗試添加一個新人,我會得到一個Hibernate-TransientPropertyValueException
,它表示Object references an unsaved transient instance - save the transient instance before flushing.
有人能幫我一下嗎?
你能試試這個嗎
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn (name="COMPANY_ID")
private Adress companyId;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn (name="SUBSIDIARY_ID")
private Adress subsidiaryId;
我有一個類似的問題,一個名為Product
的表的@OneToOne
注釋到另一個名為Category
。 我想指定每個Product
必須有一個Category
。
因此,我必須確保將級聯類型設置為CascadeType.ALL
如下所示:
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "CATEGORY_NAME")
private Category category;
我不認為地址包含如此多的數據,因此可以將其作為獨立實體進行存儲。 出於性能考慮,我建議您為此使用可嵌入 + 嵌入的類:
@Embeddable
public class Address
{
String number;
String street;
String city;
String country;
}
@Entity
public class Person
{
@Id
protected long id
...
@Embedded
Address address;
@Embedded
Address companyAddress;
...
}
如果您有舊系統並且必須將地址存儲在單獨的表中,則可以使用 @SecondaryTable 解決方案:
@Entity
@Table(name = "EMPLOYEE")
@SecondaryTable(name = "ADDRESS", pkJoinColumns = @PrimaryKeyJoinColumn(name = "EMPLOYEE_ID"))
public class Employee
{
//...
@Column(table = "ADDRESS")
private Address address;
@Column(table = "ADDRESS")
private Address companyAddress;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.