[英]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.