我有以下@OneToOne映射配置(只是相关部分):
实体Trademark
@OneToOne(mappedBy = "trademark", optional = false, cascade = CascadeType.MERGE)
private ReferenceNumber referenceNumber;
实体ReferenceNumber
@OneToOne(optional = true)
private Trademark trademark;
数据库:允许referencenumber.trademark_id
为null-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);
}
现在我注意到,在很多(但并非在所有情况下)商标都被持久存储到数据库中,但trademark
中的referencenumber
的FK未设置!我已经使用了这样的配置相当长的时间(aprox 4个月),我以前从未遇到过这样的行为。运行时期间不会引发错误。这种行为的原因是什么?不久前我将Hibernate版本升级到4.2.1.Final
。可能的错误?
答案 0 :(得分:0)
在TopLink
实现中optional=false
不会在生成的模式中强制使用非空外键,如果要应用此约束,则必须使用nullable
选项。 @JoinColum
注释
@JoinColumn(nullable = false)
private ReferenceNumber referenceNumber;
注意:如果您尝试了其他一些JPA实现,它可以将optional=false
解释为非空约束