Hibernate 避免transient.TransientPropertyValueException,而不使用cascade=cascade.ALL
我想在不添加Cascade=CascadeType.ALL的情况下解决瞬态对象异常。一开始,这里是我的实体。第一个是Person.javaHibernate 避免transient.TransientPropertyValueException,而不使用cascade=cascade.ALL,hibernate,jpa,jakarta-ee,Hibernate,Jpa,Jakarta Ee,我想在不添加Cascade=CascadeType.ALL的情况下解决瞬态对象异常。一开始,这里是我的实体。第一个是Person.java public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @ManyToOne //
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;
}
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;
}
最后也是最重要的实体Company.java:
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;
}
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,但我不想这样做,因为地址是一个数据存储库,我不想保存它,我可以执行所有内容的Cascade execpt persist
感谢您的帮助。如果
地址
对象实际上是数据库中的静态数据,则必须首先查找它们,然后将它们分配给各自的人员
对象。您不能仅仅用数据填充它们并分配它们
Address usaAddress = em.createTypedQuery("select a from Address where label = 'USA'", Address.class)
.getSingleResult();
Person usaPerson = new Person();
usaPerson.setAddress(usaAddress);
...
JPA将知道它不需要再次持久化
usaAddress
,除非您采取措施更改它的状态。解决方案很简单,我刚刚添加了@Transient注释