繁体   English   中英

DataIntegrityViolationException:非null属性引用一个null或瞬态值

[英]DataIntegrityViolationException: not-null property references a null or transient value

出于某种原因,我在数据库中的几条记录中遇到了此异常(当总数> 30K时,记录为<10)。
我几乎可以肯定这不是由于空值引起的。
所以我的问题是:“除了null值之外,还有其他任何原因来获取此异常”吗?

这是我的代码:

@Entity  
@Table(name = "a")  
@SequenceGenerator(name = "a_sequence", sequenceName = "a_sequence", allocationSize = 1)  
public class A implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "a_sequence")
    private Long id;

    @NotNull
    @ManyToOne
    @JoinColumn(name = "b")
    private B fieldB;
}

@Entity  
@Table(name = "b")  
@SequenceGenerator(name = "b_sequence", sequenceName = "b_sequence", allocationSize = 1)  
public class B implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "b_sequence")
    private Long id;

    @Column(name = "message")
    private String message;
}

这是我的堆栈跟踪:

Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: ***.***.domain.A.fieldB
    at org.hibernate.engine.Nullability.checkNullability(Nullability.java:100)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:309)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:155)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)

更新:导致错误的代码

A a = getManager().find(A.class, id);  
dozerBeanMapper.map(anotherAobject, a);  
getManager().merge(a); 

在第二行,对象a处的fieldB最有可能变为空,但是根据我的日志,这是不正确的,因为对象anotherAobject中的fieldB不为空。 问题是我无法在调试模式下连接到我的应用程序。 我添加了更多日志,以便提供一些信息。 但是,如果我是对的,并且在从anotherAobject映射到fieldB后不为null,那么可能导致此异常的原因是什么?

更新:

问题是由空值引起的。 问题结束。

它必须包含一个空值,但不一定包含在数据库本身中。 例如,如果您尝试在不调用setFieldB()情况下创建A的新实例,然后尝试保留该A实体,则可能会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM