not-null属性以一对一关系引用null或瞬态值

时间:2020-03-27 14:53:06

标签: hibernate jpa jpa-2.2

从hibernate 5.1迁移到hibernate 5.4后,我的应用程序给出了以下异常: org.hibernate.PropertyValueException 非空属性引用了null或瞬态值: com.vermeg.apps.myJpaProject.Contract.customer

  • Application.java
public class Application {

    public static void main(String[] args) {
        final EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("com.mydb.ds");
        final EntityManager entityManager = entityManagerFactory.createEntityManager();
        Customer customer = entityManager.find(Customer.class, new Integer(1));
        customer.setLastName("Chemek");
        Contract contract = new Contract();
        contract.setContractType("type1");
        contract.setCustomer(customer);
        customer.setContract(contract);
        entityManager.getTransaction().begin();
        entityManager.merge(customer);
        entityManager.getTransaction().commit();
    }
}
  • Customer.java
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Customer {

   @Id
   @GeneratedValue
   private Integer id;

   private String firstName;

   private String lastName;

   @OneToOne(fetch = FetchType.LAZY, optional = true, cascade = CascadeType.ALL)
   @JoinColumns({ @JoinColumn(name = "contract_id", referencedColumnName = "id", unique = false, nullable = true) })
   private Contract contract;
}
  • Contract.java
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Contract {
    @Id
    @GeneratedValue
    private Integer id;

    private String contractType;

    @OneToOne(fetch = FetchType.LAZY, optional = false, mappedBy = "contract")
    private Customer customer;
}
  • 例外
 org.hibernate.PropertyValueException: not-null property references a null or transient value : com.vermeg.apps.myJpaProject.Contract.customer
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:813)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:776)
    at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:261)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:492)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:416)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:218)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:151)
    at org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:519)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:204)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:178)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:783)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:770)
    at com.vermeg.apps.myJpaProject.Application.main(Application.java:19)
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value : com.vermeg.apps.myJpaProject.Contract.customer
    at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:111)
    at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:55)

1 个答案:

答案 0 :(得分:0)

如果列名是id,则需要在id中使用contract_id而不是@JoinColumns。 从Customer实体看来,您的列名是id

Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Customer {

   @Id
   @GeneratedValue
   private Integer id;

   private String firstName;

   private String lastName;

   @OneToOne(fetch = FetchType.LAZY, optional = true, cascade = CascadeType.ALL)
   @JoinColumns({ @JoinColumn(name = "id", referencedColumnName = "id", unique = false, nullable = true) })
   private Contract contract;
}
相关问题