让我们看一个简单的例子,狗和猫是朋友。这并非罕见。它还具有比我的业务案例有趣得多的好处。
我们需要一个名为“ saveFriends”的函数,该函数需要一个狗名和一个猫名。我们先救狗,再救猫。为了使本示例正常工作,猫将具有对狗的引用。我知道这不是一个理想的示例,但它很可爱,可以满足我们的目的。
FriendService.java
public int saveFriends(String dogName, String catName) {
Dog fido = new Dog();
Cat felix = new Cat();
fido.name = dogName;
fido = animalDao.saveDog(fido);
felix.name = catName;
[ex.A]felix.friend = fido;
[ex.B]felix.friend = animalDao.getDogByName(dogName);
animalDao.saveCat(felix);
}
Run Code Online (Sandbox Code Playgroud)
AnimalDao.java (扩展了HibernateDaoSupport)
public Dog saveDog(Dog dog) {
getHibernateTemplate().saveOrUpdate(dog);
return dog
}
public Cat saveCat(Cat cat) {
getHibernateTemplate().saveOrUpdate(cat);
return cat;
}
public Dog getDogByName(String name) {
return (Dog) getHibernateTemplate().find("from Dog where name=?", name).get(0);
}
Run Code Online (Sandbox Code Playgroud)
现在,假设一分钟,我想使用示例A或示例B来保存我的朋友。使用一个比另一个好吗?
此外,示例B不会让您听到臭名昭著的“非null属性引用null或瞬时值”错误吗?我只是在这里猜测,但我认为这是因为Dog仍在会议中。
我将了解这些示例均无法正常工作,但请解释原因。
现在,假设一分钟,我想使用示例A或示例B来保存我的朋友。使用一个比另一个好吗?
这两个示例都可以工作(在示例B中,Hibernate将在查询执行之前刷新会话,因此它将在选择之前插入狗),但是当您已经有了狗时,我看不出要进行额外的选择(例子B)实例。我只举一个例子。
此外,示例B不会让您听到臭名昭著的“非null属性引用null或瞬时值”错误吗?
否(请参见上文)。在示例B中,狗不再是瞬态的。在示例A中,插入将以正确的顺序进行。
我只是在这里猜测,但我认为这是因为Dog仍在会议中。
一级缓存(会话)用于按ID查找,此处不是这种情况。
| 归档时间: |
|
| 查看次数: |
6005 次 |
| 最近记录: |