JavaEE,如何正确实现更新?

JavaEE,如何正确实现更新?,java,jakarta-ee,jpa,Java,Jakarta Ee,Jpa,我从我的第一个JavaEE项目开始。 现在我读了一些文档,对更新的性能或风格有一个问题。更好的是: @Override public void updateBook(BookTO to) { BookEJB book = new BookEJB(to.getISBN()); book.setFinishedReading(to.getFinishedReading()); book.setRating(to.getRating()); entityManager.

我从我的第一个JavaEE项目开始。 现在我读了一些文档,对更新的性能或风格有一个问题。更好的是:

@Override
public void updateBook(BookTO to) {
    BookEJB book = new BookEJB(to.getISBN());
    book.setFinishedReading(to.getFinishedReading());
    book.setRating(to.getRating());
    entityManager.merge(book);
}


您认为呢?

最好的方法是第二种解决方案,
合并
操作可能会导致在
BookEJB
将发展时发生意外的更改(添加新字段,但使用数据库中的其他值初始化,等等)

顺便说一句,我想你的方法是在服务层,你给它添加了事务注释了吗?

entityManager.merge()
不仅仅是一个更新操作。它是一个
更新或插入
操作,因为如果数据库中不存在此图书记录,
merge()
也会插入一条记录


第二种方法是更新JPA中现有记录的正确方法。但是请注意,在更新其属性之前,您应该检查从
entityManager.find()
返回的
book
对象是否为null。如果在数据库中找不到此book记录,将返回null,在这种情况下,您将拥有
NPE

确保在事务中调用这些方法。您可以实现容器管理的事务:

  • 在EJB中调用该方法
  • 在POJO方法上使用新引入的@Transactional
  • 或者在用户事务中

    默认情况下,如果您使用以下各项,则启用乐观锁定:

    @Version
    private int version;
    
    还可以通过在读取实体时显式锁定实体来启用悲观锁定

    @Version
    private int version;