我想实现一种在某些模型保存后在表中插入行的行为。我目前的解决方案是:(这只是我的代码的一个例子,所以请不要评论数据库或描述符模型的正确性。)
DescriptionListener.java
public class DescriptionListener {
@PostPersist
public void onPostPersist(Object entity) {
Description description = new Description("INSERT");
description.save();
}
@PostUpdate
public void onPostUpdate(Object entity) {
Description description = new Description("UPDATE");
description.save();
}
}
Description.java
@Entity
@Table(name="DESCRIPTION")
public class Description extends GenericModel {
@Id
@GeneratedValue
@Column(name="ID")
public Long id;
@Column(name="INFO")
public String info;
public Description(String info) {
this.info = info;
}
}
@EntityListener
注释来听
@Entity
@EntityListeners(DescriptionListener .class)
@Table(name="TABLE")
public class Table extends GenericModel {
...
}
但在我测试功能后,我在doc:回调方法不能调用EntityManager或Query方法!
现在我认为save()
方法是Query
方法,所以我不能在回调函数中使用(但在我的情况下它的工作原理相同),我的问题是:
如何在保存其他模型后实现相同类型的行为并保存模型?
在Play中有什么可以帮助我吗?
答案 0 :(得分:1)
借助字节码增强和JPAPlugin实现Play的JPA支持
同样如你所知,每个实体都扩展了一些类;
JPABase.java
关于CRUD操作; JPABase
向Play的插件系统广播一个事件,例如: JPASupport.objectUpdated
。
因此,您可以编写自定义PlayPlugin来捕获这些事件并进行其他一些更改。
然而,恕我直言,你应该遵循休眠的建议,并在新的交易中进行更改。在这些生命周期事件之后使用附加实体始终是一种负担。考虑异步并在另一个事务中进行更改。