【问题标题】:How to make hibernate enhancement plugin ignore some classes?如何使休眠增强插件忽略某些类?
【发布时间】:2019-08-08 15:07:01
【问题描述】:

我在我的项目中使用 hibernate-enhancement-plugin 来实现一些实体的延迟加载。但我也有一个 AuditEntity 类,它继承自 hibernate-envers 库的 DefaultTrackingModifiedEntitiesRevisionEntity 类。

插件尝试增强继承自父级的 AuditEnity 属性,但由于父级未增强而与 NPE 崩溃。

我可以从增强中以某种方式忽略这个类吗?

AuditEntity 看起来像:

@Entity
@Table(name = "Revisions")
@RevisionEntity(RevisionListenerImpl.class)
public class AuditEntity extends DefaultTrackingModifiedEntitiesRevisionEntity {

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

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }
}

它因错误而崩溃:

引起:java.lang.NoSuchMethodError: org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity.$$_hibernate_write_timestamp(J)V 在 com.netcracker.mano.om.model.entities.AuditEntity.$$_hibernate_write_timestamp(AuditEntity.java) ~[classes/:na] ...省略了48个常用框架

*timestamp 是父级继承的属性

【问题讨论】:

    标签: java hibernate hibernate-envers


    【解决方案1】:

    我怀疑这可能是一个错误。您能否在https://hibernate.atlassian.net 打开一个错误报告并提供一个测试用例,以便我为您调查?

    也就是说,我会尝试更改 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
    }
    

    在不相关的说明中,我也可能会建议对此类的命名稍作更改。 Envers 有一个具有确切名称的类,它公开了大量的查询谓词助手,您将在编写自定义 envers 查询时使用这些助手。如果您编写返回上述修订实体类的自定义查询,您需要完全限定妨碍可读性恕我直言的对象之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2011-10-18
      • 1970-01-01
      相关资源
      最近更新 更多