Java Spring JPA ManyTone-刷新前保存临时实例
我创建了一个具有数据库访问权限的Java Spring JPA ManyTone-刷新前保存临时实例,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我创建了一个具有数据库访问权限的springweb应用程序。我有一个classPerson——它引用了class地址。一个人既有地址也有公司,因此person和company都参考地址表。为此,我定义了一个从个人到地址以及公司的@ManyToOne关系 @ManyToOne @JoinColumn (name="COMPANY_ID") private Adress companyId; @ManyToOne @JoinColumn (name="SUB
springweb应用程序
。我有一个classPerson
——它引用了class地址
。一个人既有地址也有公司,因此person
和company
都参考地址表。为此,我定义了一个从个人到地址以及公司的@ManyToOne
关系
@ManyToOne
@JoinColumn (name="COMPANY_ID")
private Adress companyId;
@ManyToOne
@JoinColumn (name="SUBSIDIARY_ID")
private Adress subsidiaryId;
在person存储库中,我有一个保存方法,如下所示:
public Person save(Person entity) {
SaveAccess<Person> ao = createSaveAccess();
ao.setEntity(entity);
ao.execute();
return ao.getResult();
}
公共人物保存(人物实体){
SaveAccess ao=createSaveAccess();
ao.实体(实体);
ao.execute();
返回ao.getResult();
}
问题是,如果我尝试添加一个新人,我会得到一个Hibernate TransientPropertyValueException
,上面说对象引用了一个未保存的临时实例-在刷新之前保存临时实例。
这里有人能帮我吗?你能试试吗
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn (name="COMPANY_ID")
private Adress companyId;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn (name="SUBSIDIARY_ID")
private Adress subsidiaryId;
参考:
我认为地址包含的数据太多,不足以作为独立实体存储。出于性能考虑,我建议您为此使用Embeddeble+嵌入式类:
@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;
}
我在一个名为Product
的表到另一个名为Category
的表的@OneToOne
注释中遇到了类似的问题。我想指定每个产品
必须有一个类别
因此,我必须确保将级联类型设置为CascadeType
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "CATEGORY_NAME")
private Category category;
谢谢你的回答。问题是,如果companyId和subdiaryId不同,并且不在数据库中,那么它现在就可以工作了。但是如果subdiaryID和companyId相同或者其中一个在数据库中,我会得到一个违反UniqueConstraint的异常。我必须在这里进行双向关联吗?类似于地址中的一对一映射?这样:@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)@JoinColumn(name=“COMPANY\u ID”)私有设置个人公司;@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)@JoinColumn(name=“SUBSIDIARY\u ID”)私有设置个人子公司
您找到了一个解决方案吗?当公司和子公司已经存储在数据库中时,如何更新它们?不幸的是,我无法做到这一点,因为需要将地址存储在数据库中一个单独的表中。这是因为我们不仅需要人的地址,还需要其他实体的地址。在这种情况下,您可以应用@SecondaryTable解决方案。我修改了我的答案。问题是,我也需要一个实体地址,因为我有一个rest服务,它会返回它们。