Java 如何使hibernate增强插件忽略某些类?

Java 如何使hibernate增强插件忽略某些类?,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,我在项目中使用hibernate增强插件来实现一些实体的延迟加载。但我还有一个从hibernate envers库的DefaultTrackingModifiedEntitysRevisionEntity类继承的类AuditEntity 插件试图增强从父级继承的AuditEnity的属性,但由于父级未得到增强,因此在NPE中崩溃 我可以从增强的角度忽略这个类吗 AuditEntity看起来像: @实体 @表(name=“修订版”) @修订实体(修订列表执行类) 公共类AuditEntity扩展了

我在项目中使用hibernate增强插件来实现一些实体的延迟加载。但我还有一个从hibernate envers库的DefaultTrackingModifiedEntitysRevisionEntity类继承的类AuditEntity

插件试图增强从父级继承的AuditEnity的属性,但由于父级未得到增强,因此在NPE中崩溃

我可以从增强的角度忽略这个类吗

AuditEntity看起来像:

@实体
@表(name=“修订版”)
@修订实体(修订列表执行类)
公共类AuditEntity扩展了DefaultTrackingModifiedEntitysRevisionEntity{
@列(name=“user\u id”)
私有字符串用户标识;
公共字符串getUserId(){
返回用户标识;
}
public void setUserId(字符串userId){
this.userId=userId;
}
}
它因错误而崩溃:

原因:java.lang.NoSuchMethodError: org.hibernate.envers.defaultTrackingModifiedEntitysRevisionEntity.$$\u hibernate\u write\u时间戳(J)V 在 com.netcracker.mano.om.model.entities.AuditEntity.$$\u hibernate\u write\u时间戳(AuditEntity.java) ~[classes/:na]。。。省略48个公共帧


*时间戳是父级继承的属性

我怀疑这可能是一个bug。你能在打开一个bug报告并提供一个测试用例,这样我就可以为你调查它了吗

这就是说,我将尝试更改
AuditEntity
,以直接包含所有父类行为,因此基本上您的实现将如下所示,并看看现在是否可以改进

@Entity
@Table(name = "Revisions")
@RevisionEntity(RevisionListenerImpl.class)
public class AuditEntity {
  @Id
  @GeneratedValue
  @RevisionNumber
  private int id;

  @RevisionTimestamp
  private long timestamp;

  @ElementCollection(fetch = FetchType.EAGER)
  @JoinTable(name = "REVCHANGES", joinColumns = @JoinColumn(name = "REV"))
  @Column(name = "ENTITYNAME")
  @Fetch(FetchMode.JOIN)
  @ModifiedEntityNames
  private Set<String> modifiedEntityNames = new HashSet<>();

  @Column(name = "user_id")
  private String userId;

  // Getters, Setters, hashCode/equals implementations
  // Be sure to copy the hashCode/equals behavior from the two super types 
  //   - DefaultRevisionEntity
  //   - DefaultTrackingModifiedEntitiesRevisionEntity
}
@实体
@表(name=“修订版”)
@修订实体(修订列表执行类)
公共类审计实体{
@身份证
@生成值
@修正数
私有int-id;
@修正时间戳
私有长时间戳;
@ElementCollection(fetch=FetchType.EAGER)
@JoinTable(name=“REVCHANGES”,joinColumns=@JoinColumn(name=“REV”))
@列(name=“ENTITYNAME”)
@Fetch(FetchMode.JOIN)
@修饰名
私有集modifiedEntityNames=new HashSet();
@列(name=“user\u id”)
私有字符串用户标识;
//getter、setter、hashCode/equals实现
//确保从两个超级类型复制hashCode/equals行为
//-默认修订实体
//-DefaultTrackingModifiedEntitysRevisionEntity
}

另一方面,我可能也会建议对这个类的命名做一点小小的改变。Envers有一个具有确切名称的类,该类公开了过多的查询谓词帮助程序,您将在编写自定义Envers查询时使用这些帮助程序。如果您编写了返回上述修订实体类的自定义查询,则需要完全限定其中一个对象,这会妨碍imho的可读性。

我怀疑这可能是一个bug。你能在打开一个bug报告并提供一个测试用例,这样我就可以为你调查它了吗

这就是说,我将尝试更改
AuditEntity
,以直接包含所有父类行为,因此基本上您的实现将如下所示,并看看现在是否可以改进

@Entity
@Table(name = "Revisions")
@RevisionEntity(RevisionListenerImpl.class)
public class AuditEntity {
  @Id
  @GeneratedValue
  @RevisionNumber
  private int id;

  @RevisionTimestamp
  private long timestamp;

  @ElementCollection(fetch = FetchType.EAGER)
  @JoinTable(name = "REVCHANGES", joinColumns = @JoinColumn(name = "REV"))
  @Column(name = "ENTITYNAME")
  @Fetch(FetchMode.JOIN)
  @ModifiedEntityNames
  private Set<String> modifiedEntityNames = new HashSet<>();

  @Column(name = "user_id")
  private String userId;

  // Getters, Setters, hashCode/equals implementations
  // Be sure to copy the hashCode/equals behavior from the two super types 
  //   - DefaultRevisionEntity
  //   - DefaultTrackingModifiedEntitiesRevisionEntity
}
@实体
@表(name=“修订版”)
@修订实体(修订列表执行类)
公共类审计实体{
@身份证
@生成值
@修正数
私有int-id;
@修正时间戳
私有长时间戳;
@ElementCollection(fetch=FetchType.EAGER)
@JoinTable(name=“REVCHANGES”,joinColumns=@JoinColumn(name=“REV”))
@列(name=“ENTITYNAME”)
@Fetch(FetchMode.JOIN)
@修饰名
私有集modifiedEntityNames=new HashSet();
@列(name=“user\u id”)
私有字符串用户标识;
//getter、setter、hashCode/equals实现
//确保从两个超级类型复制hashCode/equals行为
//-默认修订实体
//-DefaultTrackingModifiedEntitysRevisionEntity
}
另一方面,我可能也会建议对这个类的命名做一点小小的改变。Envers有一个具有确切名称的类,该类公开了过多的查询谓词帮助程序,您将在编写自定义Envers查询时使用这些帮助程序。在编写返回上述修订实体类的自定义查询时,需要完全限定其中一个对象,这会妨碍imho的可读性