了解Hibernate saveOrUpdate和持久性生命周期

Ste*_*ano 4 java hibernate

让我们看一个简单的例子,狗和猫是朋友。这并非罕见。它还具有比我的业务案例有趣得多的好处。

我们需要一个名为“ 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仍在会议中。

我将了解这些示例均无法正常工作,但请解释原因。

Pas*_*ent 5

现在,假设一分钟,我想使用示例A或示例B来保存我的朋友。使用一个比另一个好吗?

这两个示例都可以工作(在示例B中,Hibernate将在查询执行之前刷新会话,因此它将在选择之前插入狗),但是当您已经有了狗时,我看不出要进行额外的选择(例子B)实例。我只举一个例子。

此外,示例B不会让您听到臭名昭著的“非null属性引用null或瞬时值”错误吗?

否(请参见上文)。在示例B中,狗不再是瞬态的。在示例A中,插入将以正确的顺序进行。

我只是在这里猜测,但我认为这是因为Dog仍在会议中。

一级缓存(会话)用于按ID查找,此处不是这种情况。