仅使用主键加载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
}