Java @OneToOne关系-NOT NULL属性在Hibernate中保持为NULL,没有错误
我有以下@OneToOne映射配置(仅相关部分): 实体Java @OneToOne关系-NOT NULL属性在Hibernate中保持为NULL,没有错误,java,hibernate,one-to-one,Java,Hibernate,One To One,我有以下@OneToOne映射配置(仅相关部分): 实体商标 @OneToOne(mappedBy = "trademark", optional = false, cascade = CascadeType.MERGE) private ReferenceNumber referenceNumber; 实体ReferenceNumber @OneToOne(optional = true) private Trademark trademark; 数据库:允许referencenumber
商标
@OneToOne(mappedBy = "trademark", optional = false, cascade = CascadeType.MERGE)
private ReferenceNumber referenceNumber;
实体ReferenceNumber
@OneToOne(optional = true)
private Trademark trademark;
数据库:允许referencenumber.trademark\u id
为空FK,在trademark
表中没有引用列
我使用以下代码进行实体分配:
Session session = HibernateUtil.getSessionFactory().openSession();
long start = System.currentTimeMillis();
Transaction tx = null;
try {
tx = session.beginTransaction();
//private ReferenceNumber ref;
ref.setError(0);
// Trademark trademark;
trademark.setReferenceNumber(ref);
trademark.setService(ref.getService());
session.save(trademark);
ref.setTrademark(trademark);
session.update(ref);
tx.commit();
log.debug("Inserted row id={}", trademark.getId());
} catch (RuntimeException ex) {
log.error("Error during attempt to persist new trademark", ex);
if (tx != null) {
tx.rollback();
}
throw ex;
} finally {
session.close();
log.trace("Db processing time: {}ms", System.currentTimeMillis() - start);
}
现在我注意到,在很多情况下(但并非所有情况下),商标都会保留在DB中,但在referencenumber
中未设置FK totrademark
!我使用这种配置已经有相当长的时间了(大约4个月),我以前从未遇到过这种行为。运行时不会引发任何错误。这种行为的原因是什么?不久前,我将Hibernate版本升级到4.2.1.Final
。可能的错误?在TopLink
实现中optional=false
不会在生成的架构中强制使用非null外键,如果要应用此约束,必须使用@joincolm
注释中的null
选项
@JoinColumn(nullable = false)
private ReferenceNumber referenceNumber;
注意:如果您尝试了其他一些JPA实现,它可能会将optional=false
解释为NOTNULL约束