Hibernate / JPA 2.0 @OneToOne与可能不存在的匹配行的关系

时间:2013-08-15 11:22:45

标签: hibernate jpa-2.0 one-to-one

我有两张桌子,让我们说 Person和Person_info 。两个表都有共享PK person_id ,它也用作外键。 情况是,可能存在Person_info不存在的Person。 Person_info对于人是可选的,不需要存在具有相同person_id的行。 当我想搜索有休眠的人时,例如:

Criteria criteria = session.createCriteria(Person.class);
criteria.add(Restrictions.eq("name", name));
Object obj = criteria.uniqueResult();

我得到一个例外:

 [<package>.PersonInfo#338664] org.hibernate.ObjectNotFoundException: No row with the given identifier exists:  <package>.PersonInfo#338664]

当然,person_info = 338664的Person_info行确实不存在。但我仍然希望hibernate能够处理这个问题。 如果该行存在,那么我想加载它,如果它不是我想要为空,而不是例外。

我正在使用hibernate版本3.5.6-Final。 我认为这个线程完全是同一个问题,但它没有解决方案@PrimaryKeyJoinColumn with Bidirectional @OneToOne relationship

感谢您的帮助。

带注释的类看起来像这样:

人员类:

@Entity
@Table(name="Person")
public class Person extends BaseDBEntity<Integer>{
    private PersonInfo personInfo;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="person_id")
    public Integer getId() {
      return id;
    }

    @OneToOne(cascade = CascadeType.ALL, optional = true)
    @PrimaryKeyJoinColumn
    public PersonInfo getPersonInfo() {
      return personInfo;
    }
}

PersonInfo类:

@Entity
@Table(name="Person_info")
public class PersonInfo extends BaseDBEntity<Integer> {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="person_id")
    public Integer getId() {
      return id;
    }
}  

它们都继承自BaseDBEntity:

public abstract class BaseDbEntity<T> implements Serializable {

      private static final long serialVersionUID = 1L;

      protected T id;
}

1 个答案:

答案 0 :(得分:1)

这是已知的错误:HHH-4982 JPA OneToOne(optional = true)不支持@PrimaryKeyJoinColumn )。

通过更新到更新的版本可以解决问题。 Bug在3.6.8中已修复,但如果不能选择Hibernate 4,可能更新到3.6.10是有意义的。