我从第一个Java EE项目开始。 现在我阅读了一些文档,并对更新的性能或风格提出了疑问。更好的是:
@Override
public void updateBook(BookTO to) {
BookEJB book = new BookEJB(to.getISBN());
book.setFinishedReading(to.getFinishedReading());
book.setRating(to.getRating());
entityManager.merge(book);
}
或
@Override
public void updateBook(BookTO to) {
BookEJB book = entityManager.find(BookEJB.class, to.getISBN());
book.setFinishedReading(to.getFinishedReading());
book.setRating(to.getRating());
}
您怎么看?
答案 0 :(得分:3)
entityManager.merge()
不仅仅是一个更新操作。如果{book}记录在数据库中不存在,update or insert
merge()
也会插入记录。
第二种方法是更新JPA中现有记录的正确方法。但请注意,在更新其属性之前,应检查book
返回的entityManager.find()
对象是否为null。如果在数据库中找不到此书记录,则返回null,在这种情况下您将获得NPE
。
答案 1 :(得分:0)
最好的方法是第二个解决方案,merge
操作可能导致BookEJB
发展时无法更改(添加新字段但使用数据库中的其他值初始化等等)
答案 2 :(得分:0)
确保在事务中调用方法。您可以实现容器管理的事务:
或在用户交易中。
默认情况下,如果您正在使用,则启用乐观锁定:
@Version
private int version;
您还可以通过在读取实体时显式锁定实体来启用悲观锁定。