3

我有两张表,比如说Person 和 Person_info。两个表都有共享的 PK person_id,它也用作外键。情况是,可能存在不存在 Person_info 的 Person。Person_info 对于 person 是可选的,不需要存在具有相同 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_id=338664 的 Person_info 行确实不存在。但我仍然希望 hibernate 能够处理这个问题。如果该行存在,那么我想加载它,如果它不存在,我想获取 null,而不是异常。

我正在使用休眠版本 3.5.6-Final。我认为这个线程是完全相同的问题,但它没有解决方案@PrimaryKeyJoinColumn 与双向@OneToOne 关系

感谢您的帮助。

带注释的类如下所示:

人物类:

@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;
    }
}

个人信息类:

@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;
}
4

1 回答 1

1

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

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

于 2013-08-15T18:09:38.787 回答