2017-08-02 51 views
0

我是休眠的新手。我想知道是否有任何crud操作發生,所以我決定使用jpa回調註釋。問題是當我運行項目並使用UI組件執行刪除&添加操作時,不會調用任何這些@PrePersist @PostPersist @PreRemove @PostRemove。我使用primefaces數據表刪除ManagedBean - > MessageService - > MessageDAO的操作。如果我只執行主文件來測試它完美JPA回調不被稱爲

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!!!!!!!!!!!!"); 
} 

} 
+0

是否在'delete'方法查詢執行? –

+0

是的,它從數據庫刪除記錄 –

+0

檢查[this](https://stackoverflow.com/a/28341046/3094731)是否有幫助。 –

回答

1

根據JPA規範,當使用JPQL BULK DELETE時,不會調用JPA回調/偵聽器。只有在使用JPA API時纔會調用它們(em.remove)。同樣,緩存和管理實體對象也不會反映這種調用。

+0

我已將我的刪除方法更改爲:@Transactional public void delete(Integer id){ Message m = em.find(Message.class,id); em.remove(m); }當我在main方法中調用delete時,調用回調函數。但是當我運行該項目並點擊刪除按鈕時,它不起作用。有沒有辦法做到這一點* –

+0

不知道你的「刪除」按鈕是什麼。當您使用'em.remove'時,JPA API將調用回調函數,並且如果JPA提供程序不是那麼它就是JPA提供程序中的錯誤。 –

+0

這是一個與ManagedBean綁定的primefaces命令按鈕。在託管bean中,我只調用MessageService.delete方法,該方法調用messageDAO.delete –

0

變化通過下面的例子中,您的代碼希望將工作

@Transactional 
    public void delete(Long id) { 

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

在測試方法中,回調函數以這種方式調用。但是當我運行項目和訪問刪除方法通過點擊一個數據表刪除圖標回調不會被調用 –

+0

您的記錄從數據庫中刪除? – Assen

+0

是的,它被刪除 –