为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法用休眠 - envers来审计,一个在其嵌入式Id中具有@Embedded的实体

有没有办法用休眠 - envers来审计,一个在其嵌入式Id中具有@Embedded的实体

噜噜哒 2022-09-22 13:46:50
我有一个实体集团记录具有复合代码BlocRecordId,并且在其复合代码中有一个@Embedded(关系代码ManyToOne)指向另一个原始记录并希望审核实体集团记录。实体集团记录@Entity@Inheritance(strategy = InheritanceType.JOINED)@Table(name = "blocRecord")@Access(value = AccessType.FIELD)@Auditedpublic class BlocRecord {    @EmbeddedId    private BlocRecordId blocRecordId = new BlocRecordId();    @ManyToOne(fetch = FetchType.LAZY, optional = false)    @JoinColumns({            @JoinColumn(name = "record_identifier_", referencedColumnName = "identifier_", unique = false, nullable = false),            @JoinColumn(name = "record_recordType_", referencedColumnName = "recordType_", unique = false, nullable = false)})    @MapsId("record")    private Record record;...}标识类块记录 ID@Embeddablepublic class BlocRecordId implements Serializable {    @Embedded    private RecordId record;    @Column(name = "source_")    String source ;    @Column(name = "messageType_")    String messageType ;实体记录@Entity@Inheritance(strategy = InheritanceType.JOINED)@Table(name = "records")@Access(value = AccessType.FIELD)@Auditedpublic class Record {    @EmbeddedId    private RecordId recordId = new RecordId();    @OneToMany(targetEntity = BlocRecord.class, fetch = FetchType.LAZY, mappedBy = "record")    private Set<BlocRecord> blocRecord = new java.util.HashSet<>();...}实体记录的 id 类@Embeddablepublic class RecordId implements Serializable{    @Column(name = "identifier_")    String identifier ;    @Column(name = "recordType_")    String recordType ;}休眠 -envers 在尝试在可嵌入的 BlocRecordId 中生成字段记录的元数据时失败,引发流动异常您知道如何解决问题吗?
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

目前,Envers 不支持在可嵌入对象中嵌套嵌入对象的想法,当我们映射标识符列时,如您的示例所示。Envers 目前支持的唯一有效映射是可嵌入对象中的属性是 a 或 类型。@ManyToOne@Basic


您可以解决此问题,但它涉及更明确一点,而不是使用。我的意思是重写如下:RecordIdBlocRecordId


@Embeddable

public class BlocRecordId implements Serializable {

  @Column(name = "identifier_")

  String identifier;


  @Column(name = "recordType_")

  String recordType;


  @Column(name = "source_")

  String source;


  @Column(name = "messageType_")

  String messageType;


  @Transient

  private RecordId recordId;


  /** Helper method to assign the values from an existing RecordId */

  public void setRecordId(RecordId recordId) {

    this.identifier = recordId.getIdentifier();

    this.recordType = recordId.getRecordType();

  }


  /** Helper method to get the RecordId, caching it to avoid multiple allocations */

  public RecordId getRecordId() {

    if ( recordId == null ) {

      this.recordId = new RecordId( identifier, recordType );

    }

    return this.recordId;

  }

}

我同意这并不理想,但它至少可以解决代码的当前限制。我已经添加并添加了HHH-13361作为开放问题来支持这一点。如果您愿意,欢迎您做出贡献,或者我将努力为Envers 6.0提供此支持。


查看完整回答
反对 回复 2022-09-22
  • 1 回答
  • 0 关注
  • 62 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信