Hibernate中废弃的save方法的替代方案。

6
我将使用以下代码将一个人的对象保存到数据库中:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Main {

    public static void main(String[] args) {
        Person person = new Person();
        person.setID(1);
        person.setName("name-1");
        person.setAddress("address-1");

        Configuration configuration = new Configuration().configure().addAnnotatedClass(Person.class);
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        session.save(person);
        transaction.commit();
    }
}

我看到save方法已经被废弃了。我们应该使用哪种替代方法?

2个回答

8

save()方法已经被Hibernate 6.0弃用。根据javadoc,建议使用persist()方法。

弃用警告。

请使用persist(Object)方法。

save()persist()两者类似但不同。 save()立即持久化实体并返回生成的ID,而persist()只是将实体标记为待插入状态。根据标识符生成器的不同,ID可能会异步生成,例如在会话刷新时。


3
这是一个非常不完整的答案。你绝不能简单地将所有save()的出现替换为persist(),因为两种方法具有完全不同的语义。虽然save() _保证_在调用后对象中存在生成的键,但persist()则没有。它们还具有不同的级联行为和其他可能不同的行为。很可能仅仅替换方法调用就会破坏任何复杂的应用程序。因此,每个替换都需要仔细调查其后果和进一步的伴随更改。 - UniversE
1
@UniversE 这是一个有价值的补充。感谢分享!请随意更新我的答案。 - thokuest

2

save()从来不是JPA的一部分。由于Hibernate比JPA早,因此它继续使用它,现在已被弃用,并将在将来删除。
persist():Persist方法用于保存新创建的实体。
merge():应该用于更新分离的实体对象。
update():它强制将实体对象从分离状态转换为持久状态。与merge()不同,它不会进行不必要的SELECT调用。
注意:INSERT语句仅在提交事务、刷新或关闭会话时发生。


如果IdentityGenerator需要,INSERT语句也可以立即发生。例如,在使用Identity策略的自动生成ID的情况下。不过persist()方法是否会这样还不确定。 - Stanislav Bashkyrtsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接