Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 避免transient.TransientPropertyValueException,而不使用cascade=cascade.ALL_Hibernate_Jpa_Jakarta Ee - Fatal编程技术网

Hibernate 避免transient.TransientPropertyValueException,而不使用cascade=cascade.ALL

Hibernate 避免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 //

我想在不添加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
//(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注释