我有以下@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);
}现在我注意到在很多情况下(但不是在所有情况下),商标是持久化到DB中,但referencenumber中的FK到trademark没有设置!我使用这种配置已经相当长的时间了(大约4个月),我以前从来没有遇到过这样的行为。运行时期间不会抛出错误。导致这种行为的原因是什么?不久前,我将Hibernate版本升级到了4.2.1.Final。可能是bug?
发布于 2013-12-09 19:18:22
在TopLink实现中,optional=false不会在生成的模式中强制使用非空外键,如果要应用此约束,则必须在@JoinColum标注中使用nullable选项
@JoinColumn(nullable = false)
private ReferenceNumber referenceNumber;注意:如果您尝试了其他一些JPA实现,它可能会将optional=false解释为非空约束。
https://stackoverflow.com/questions/20466226
复制相似问题