【问题标题】:JPA Callback not being called未调用 JPA 回调
【发布时间】:2018-01-09 05:17:24
【问题描述】:

我是休眠新手。我想知道是否发生任何 crud 操作,所以我决定使用 jpa 回调注释。问题是当我运行项目并使用 UI 组件执行删除和添加操作时,没有调用任何 @PrePersist @PostPersist @PreRemove @PostRemove。我使用 primefaces 数据表,因此删除操作绑定到 ManagedBean -> MessageService -> MessageDAO。如果我只执行主文件来测试它,它可以完美运行

MessageDAO:

@Component
public class MessageDAO {


@PersistenceContext
private EntityManager em;

@Transactional
public void register(Message message) {
    em.persist(message);
}


@Transactional
public void delete(Integer id) {

     Message m =  em.find(Message.class, id);
     em.remove(em.merge(m));
   }
}

消息监听器

public class MessageListener {

@PrePersist
public void prePersist(Message o) {
    System.out.println("Pre-Persistiting operation: " );
}

@PostPersist
public void postPersist(Message o) {
    System.out.println("Post-Persist operation: " );
}

@PreRemove
public void preRemove(Message o) {
    System.out.println("Pre-Removing operation: " );
}

@PostRemove
public void postRemove(Message o) {
    System.out.println("Post-Remove operation: " );
}

@PreUpdate
public void preUpdate(Message o) {
    System.out.println("Pre-Updating operation: ");
}

@PostUpdate
public void postUpdate(Message o) {
    System.out.println("Post-Update operation: " );
  }
}

留言

  @EntityListeners(MessageListener.class)
  @Entity
  @Table(name = "messages")
public class Message implements Serializable  {

private Integer messageId;

private String subject;

private String content;

public Message(){}

public Message(Integer messageId, String subject, String content) {
    this.messageId = messageId;
    this.subject = subject;
    this.content = content;
}


@Id
@GeneratedValue
@Column(name = "MESSAGE_ID")
public Integer getMessageId() {
    return messageId;
}

//getter setter
@PrePersist
public void prePersist() {
    System.out.println("OLDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU!!!!!!!!!!!!");
}

}

【问题讨论】:

  • delete方法中的查询是否执行?
  • 是的,它从数据库中删除记录
  • 检查this是否有帮助。

标签: spring hibernate jpa


【解决方案1】:

通过以下示例更改您的代码,希望它能正常工作

@Transactional
    public void delete(Long id) {

         Message m = em.find(Message.class, id);
         em.remove(em.merge(m));
       }
    }

【讨论】:

  • 在测试方法中以这种方式调用回调。但是当我运行项目并通过单击数据表删除图标访问删除方法时,不会调用回调
  • 您的记录已从数据库中删除?
  • 是的,它被删除了
【解决方案2】:

根据 JPA 规范,使用 JPQL BULK DELETE 时不会调用 JPA 回调/侦听器。它们仅在使用 JPA API (em.remove) 时被调用。同样,缓存和托管实体对象也不会反映这样的JPQL BULK DELETE 调用。

【讨论】:

  • 我已将删除方法更改为:@Transactional public void delete(Integer id) { Message m = em.find(Message.class, id); em.remove(m);当我在 main 方法中调用 delete 时,会调用回调。但是当我运行项目并单击删除按钮时,它不起作用。有没有办法做到*
  • 不知道你的“删除”按钮是什么。当您使用 em.remove 时,JPA API 将调用回调,如果 JPA 提供程序没有,那么这是 JPA 提供程序中的错误。
  • 这是一个绑定到 ManagedBean 的 primefaces 命令按钮。在托管 bean 中,我只调用 MessageService.delete 方法,该方法调用 messageDAO.delete
  • 既然您现在已经从原始问题更改了您的问题(即删除了 JPQL BULK DELETE 的使用),那么在这里继续下去就没有意义了。该答案与原始问题有关。如前所述,如果您对“em.remove”不调用回调有问题,那么您调试它,并在您的 JPA 提供程序上引发错误
猜你喜欢
  • 2014-11-21
  • 2018-05-01
  • 1970-01-01
  • 2014-05-30
  • 2014-12-31
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多