出于某种原因,我在我的数据库中记录了几条记录的异常(< 10时总计> 30K)。
我几乎可以肯定这不是因为空值造成的
所以我的问题是:“除了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变为null,但根据我的日志,这不是真的,因为对象anotherAobject中的fieldB不为null。问题是我无法在调试模式下连接到我的应用程序。我添加了更多日志,以便提供一些信息。 但是如果我是对的,并且在从anotherAobject映射到fieldB之后不是null,那么什么可能导致这个异常呢?
更新:
问题是由空值引起的。问题已经结束。
答案 0 :(得分:1)
它必须涉及空值,但不一定涉及数据库本身。例如,如果您尝试创建A
的新实例而不在其上调用setFieldB()
,则可能会发生这种情况,然后您尝试保留该A
实体。