Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA-如何在提交后调用web服务的方法_Java_Jpa - Fatal编程技术网

Java JPA-如何在提交后调用web服务的方法

Java JPA-如何在提交后调用web服务的方法,java,jpa,Java,Jpa,抱歉,这可能非常简单,但我是JPA新手,我不确定在将新记录提交到数据库后,在何处插入需要调用的方法的函数调用。我有以下资料: @POST @Override @Consumes({"application/xml", "application/json"}) @Path("...") @RolesAllowed("...") public void create(LearningActivity entity){ super.create(entity); } 在上述过程完成后,我需要

抱歉,这可能非常简单,但我是JPA新手,我不确定在将新记录提交到数据库后,在何处插入需要调用的方法的函数调用。我有以下资料:

@POST
@Override
@Consumes({"application/xml", "application/json"})
@Path("...")
@RolesAllowed("...")
public void create(LearningActivity entity){
    super.create(entity);
}
在上述过程完成后,我需要调用一个自定义方法myMethod()。我想我可以在super.create(entity)之后立即添加它,但很明显,提交过程直到整个create()方法执行才完成。我还尝试将@PostPersist添加到基础实体中,但这仍然是在提交记录之前

任何帮助都将不胜感激

我不确定在何处为需要的方法插入函数调用 将新记录提交到数据库后调用

听起来您需要使用事件监听器,每次将实体提交到数据库时都会执行一个名为PostPersist的事件,您可以使用上面的代码进行配置

@Entity
public class X{
  @PostPersist
  public void myMethod(){
    //Do anything before the commit of the transaction that save a new entity of type X 
  }

 @PostUpdate
 public void myMethod2(){
  //This code will run each time you update and save an entity of type X
 }
}
PostPersist在提交完成后调用,PrePersist在您调用persist方法时执行。

基于,在提交之前调用
@PostPersist

我发现的另一种方法是创建一个静态助手方法,在提交当前事务会话后调用
Runnable

publicstaticvoidaftertransactioncommitted(最终可运行函数){
if(TransactionSynchronizationManager.isSynchronizationActive()){
TransactionSynchronizationManager.registerSynchronization(
新建TransactionSynchronizationAdapter(){
@凌驾
public void afterCommit(){
函数run();
}
}
);
}否则{
函数run();
}
}
你会像这样使用它

afterTransactionCommitted(() -> myMethod());

Koitoer,谢谢你。实际上,我已经按照您的建议在实体级别尝试了PostPersist。这方面的文档似乎有些混乱。给出的一般描述是,它“在数据库中存储新实体后(在提交或刷新期间)”执行。使用调试器,我能够确定PostPersist似乎在数据持久化到JPA对象之后,但在提交到DB之前执行。我还需要进一步测试,但我将抛弃JPA,回到JDBC。我想知道是否需要添加一个类似于j2ee事件监听器servlet的自定义事件监听器,并且过滤器与JPA无关,显然,您可以在事务结束时在数据库中添加一个过滤器来生成任何进程,但这听起来不是一个好的设计,但是谁在乎XD呢,我建议最好使用带有事务注释的服务层。谢谢您的提醒。你能给我举一个带有事务注释的服务层的例子吗?我会很感激的,因为我仍然被这一切弄得不知所措。