java—从hibernate abstractevents和eventlisteners调用repository.save(entity)时,如何访问使用的原始实体?

bgtovc5b  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(314)

我使用的是jpa/hibernate/spring,有一个简单的jpa实体模型,如下所示:

@Entity
@Table(name = "record")
public class Record extends BaseEntity {

  //...

  @OneToMany(mappedBy = "record", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<Document> documents;
}
@Entity
@Table(name = "document")
public class Document extends BaseEntity {

//...

@ManyToOne
@JoinColumn(name = "record_id")
private Record record;

@ManyToOne
@JoinColumn(name = "document_model_id")
private DocumentModel documentModel;
@Entity
@Table(name = "document_model")
public class DocumentModel extends BaseEntity {
//...
}

还有我的 RecordService 如图所示:

@Transactional
public class RecordService {

private RecordRepository repository;     

  public RecordDTO update(RecordDTO dto) {
    Record record = repository.findById(dto.getId()); 
    updateEntity(entity, dto);
    repository.save(entity); 
  }
}

我还有一个通用事件侦听器:

public class RecordEventListener implements PostUpdateEventListener {

   @Override
   public void onPostUpdate(PostUpdateEvent event) {

     Object[] oldState = event.getOldState();
     Object[] currentState = event.getState();
     Object entity = event.getEntity();
     //original Record id? 
   }

   //...
}

我的理解是,当我调用update方法(在服务层上)时,任何脏的jpa对象都将被更新/持久化到数据库中,并且在关闭事务之前,将生成postpdate事件,由侦听器处理。有时记录对象本身没有直接的更改,因此不会为记录实体本身生成postupdateevent,而只为记录对象图上其他受影响的jpa实体生成postupdateevent,这是预期的。
是否有可能以某种方式通过 repository.save(entity); 通过事务信息调用方法?我需要找到它的身份证。

j7dteeu8

j7dteeu81#

你说的“原始身份证”是什么意思?id不能更改,因此“当前实体”的id与实体传递到时的id相同 save . 这个 PostUpdateEvent 甚至有一个 getId 方法可以用于此目的。

相关问题