Java EE,如何正确实现更新?

时间:2013-09-19 07:38:51

标签: java java-ee jpa

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

您怎么看?

3 个答案:

答案 0 :(得分:3)

entityManager.merge()不仅仅是一个更新操作。如果{book}记录在数据库中不存在,update or insert merge()也会插入记录。

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

答案 1 :(得分:0)

最好的方法是第二个解决方案,merge操作可能导致BookEJB发展时无法更改(添加新字段但使用数据库中的其他值初始化等等)

顺便说一句,我想你的方法是在服务层,你是否把交易注释放到了它?

答案 2 :(得分:0)

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

  1. 在EJB中调用方法
  2. 在POJO方法上使用新引入的@Transactional
  3. 或在用户交易中。

    默认情况下,如果您正在使用,则启用乐观锁定:

    @Version
    private int version;
    

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