JavaEE,如何正确实现更新?
我从我的第一个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.
@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;