gpt4 book ai didi

java - 了解 Hibernate saveOrUpdate 和持久化生命周期

转载 作者:搜寻专家 更新时间:2023-11-01 01:38:48 26 4
gpt4 key购买 nike

让我们看一个简单的例子,一只狗和一只猫是 friend 。这种情况并不罕见。它还具有比我的业务案例有趣得多的好处。

我们想要一个名为“saveFriends”的函数,它接受狗的名字和猫的名字。我们先救狗,然后救猫。为了让这个例子起作用,猫将有一个对狗的引用。我知道这不是一个理想的例子,但它很可爱并且适合我们的目的。

friend 服务.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);
}

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

现在,假设我想使用示例 A 或示例 B 来拯救我的 friend 。一个比另一个更好用吗?

此外,示例 B 不会让您遇到臭名昭著的“非空属性引用空值或 transient 值”错误吗?我只是在这里猜测,但我认为这是因为 Dog 仍在 session 中。

如果这些示例都不起作用,我会理解,但请解释原因。

最佳答案

Now, assume for a minute that I would like to use either example A or example B to save my friend. Is one better than the other to use?

这两个示例都可以工作(在示例 B 中,Hibernate 将 flush the session before query executions 所以它会在选择之前插入狗)但是当您已经有了狗时,我看不到进行额外选择(示例 B)的意义实例。我会以 A 为例。

Furthermore, won't example B get you the infamous "not-null property references a null or transient value" error?

否(见上文)。在示例 B 中,狗不再是短暂的。在示例 A 中,插入将以正确的顺序完成。

I'm only guessing here but I would think this is because the Dog is still in the session.

一级缓存(session)用于通过id查找,这里不是。

关于java - 了解 Hibernate saveOrUpdate 和持久化生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3048540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com