Java EE,如何正确实现更新



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

你觉得怎么样?

entityManager.merge()不仅仅是一个更新操作。这是一个update or insert操作,因为如果数据库中不存在该簿记merge()也会插入一条记录。

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

,在这种情况下您将NPE

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

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

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

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

或在用户事务中。

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

@Version
private int version;

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

最新更新