仅使用主键加载Hibernate代理

仅使用主键加载Hibernate代理,hibernate,Hibernate,我们有以下关系: 汽车是由一个人拥有的。 一个人可以拥有许多汽车 以下是该车的地图: <hibernate-mapping package="fr.recouv.scribe.core.bo"> <class name="Car" table="car"> <id name="id" column="id_car" unsaved-value="0"> <generator class="sequence"> <param na

我们有以下关系:
汽车是由一个人拥有的。
一个人可以拥有许多汽车

以下是该车的地图:

<hibernate-mapping package="fr.recouv.scribe.core.bo">
<class name="Car" table="car">
 <id name="id" column="id_car" unsaved-value="0">
  <generator class="sequence">
    <param name="sequence">car_id_car_seq</param>
  </generator>
</id>
<many-to-one name="person" update="false" column="id_person"  class="Person" /> 
<property 
</class>
我想为一个特定的人插入一辆车。 现在,我的代码如下所示:

Car car = new Car();
Person owner = personDao.get(idPersonOwner);
car.setPerson(owner);
carDao.save(car);
personDao.get(idPersonOwner)的hibernate实现如下

public Person  get(in idPerson){
return session.get(Person.class, id);
}
此方法的缺点

  • 即使我需要从SQL视图中仅加载其id,也会加载all Person对象
  • 如果person的映射发生变化(如延迟加载设置为false等),该操作可能会生成2个以上的查询
我的实际解决方法: 它是将外键直接映射到整数

  <property column="id_person" name="idPerson" />

这个解决方案不是面向对象的,也不太美观。 如果明天我需要检索车主,我必须像previous一样重新映射person对象,update=false

是否可以只加载给定id的人员的代理,该id将导致查询 验证此人是否存在及其主键,如果调用其他字段,则可以选择以惰性模式加载这些字段

我尝试了session.load,但这不是解决方案。在您访问另一个字段之前,对象永远不会为null(没有测试其存在性的查询),也不会引发异常
从数据库中真实加载对象。

是的,这正是(如果使用JPA)的目的。它将代理加载到对象,假设实体存在

当然,如果在提交时,外键约束因此人实际上不存在而中断,则可能会出现异常。但是,如果其他事务在提交之前删除了此人,则也可以在会话中使用它

如果确实要检查此人是否存在,请执行仅返回布尔值(或计数)的专用查询,并在知道此人存在时使用
Session.load

Number count = 
    session.createQuery("select count(p.id) from Person p where p.id = :theId")
           .setLong("theId", theId)
           .uniqueResult();
if (count.intValue() > 0) {
    Person p = session.load(Person.class, theId);
}
else {
    // throw exception
}

我希望hibernate已经有了这样的东西:(但是非常感谢你的回答!!!
Number count = 
    session.createQuery("select count(p.id) from Person p where p.id = :theId")
           .setLong("theId", theId)
           .uniqueResult();
if (count.intValue() > 0) {
    Person p = session.load(Person.class, theId);
}
else {
    // throw exception
}