我有两张桌子,让我们说 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;
}
答案 0 :(得分:1)
这是已知的错误:HHH-4982( JPA OneToOne(optional = true)不支持@PrimaryKeyJoinColumn )。
通过更新到更新的版本可以解决问题。 Bug在3.6.8中已修复,但如果不能选择Hibernate 4,可能更新到3.6.10是有意义的。