1

我从我的第一个 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());
}

你怎么看?

4

3 回答 3

3

entityManager.merge()不仅仅是一个更新动作。如果数据库中不存在该图书记录,它也是一个插入记录的update or insert动作。merge()

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

于 2013-09-19T08:06:38.577 回答
0

最好的方法是第二种解决方案,merge操作可能会在进化时导致无人注意的更改BookEJB(添加了新字段但使用数据库中的值以外的其他值进行初始化,等等......)。

顺便说一句,我想您的方法在服务层中,您是否对其进行了事务注释?

于 2013-09-19T07:59:46.410 回答
0

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

  1. 在 EJB 中调用方法
  2. 在 POJO 方法上使用新引入的 @Transactional

或者在用户事务中。

默认情况下,如果您使用的是乐观锁定:

@Version
private int version;

您还可以通过在读取实体时显式锁定实体来启用悲观锁定。

于 2013-09-20T00:27:51.223 回答