@OneToOne关系 - NOT NULL属性在Hibernate中保持为NULL而没有错误

时间:2013-12-09 08:30:33

标签: java hibernate one-to-one

我有以下@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。可能的错误?

1 个答案:

答案 0 :(得分:0)

TopLink实现中optional=false不会在生成的模式中强制使用非空外键,如果要应用此约束,则必须使用nullable选项。 @JoinColum注释

@JoinColumn(nullable = false)
private ReferenceNumber referenceNumber;

注意:如果您尝试了其他一些JPA实现,它可以将optional=false解释为非空约束