【问题标题】:avoid transient .TransientPropertyValueException without using cascade=Cascade.ALL在不使用 cascade=Cascade.ALL 的情况下避免瞬态 .TransientPropertyValueException
【发布时间】:2017-06-20 22:08:27
【问题描述】:

我想在不添加 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;
---------
}

地址在数据库中只有两个元素(“label”= USA,“label”=Canada)。它是一个数据存储库。直到这里一切都很好,但问题从这两个实体开始。

这是我的实体合同

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;
}

最后也是最重要的实体Company.java

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 但我不想这样做,因为地址是一个数据存储库,我不想保留它我可以做所有事情的级联 execpt 坚持。

感谢您的帮助。

【问题讨论】:

    标签: hibernate jpa jakarta-ee


    【解决方案1】:

    如果Address 对象实际上是数据库中的静态数据,那么您必须首先查找它们,然后将它们分配给它们各自的Person 对象。您不能只用数据填充它们并分配它们。

      Address usaAddress = em.createTypedQuery("select a from Address where label = 'USA'", Address.class)
                             .getSingleResult();
    
      Person usaPerson = new Person();
      usaPerson.setAddress(usaAddress);
      ...
    

    JPA 会知道它不需要再次持久化 usaAddress,除非你做一些事情来改变它的状态。

    【讨论】:

      【解决方案2】:

      解决方案很简单,我刚刚添加了 @Transient 注释

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-22
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 2012-02-03
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多