Hibernate envers 5.2.14 即使不需要时也会创建 hibernate_sequence 表

dre*_*nda 5 spring hibernate hibernate-envers spring-boot

我将 Spring 应用程序从 Spring Boot 1.5.x 切换到 Spring Boot 2.0。我正在使用 Hibernate Envers,在切换之前我有RevInfo一个表来存储有关修订的信息。id 是一个自动增量。

迁移后,Hibernate 创建了一个hibernate_sequence无用且未使用的新表。

我以这种方式定制了 RevInfo bean:

@Entity
@RevisionEntity(RevInfoListener.class)
public class RevInfo {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
    @GenericGenerator(name = "native", strategy = "native")
    @RevisionNumber
    private int id;

    @RevisionTimestamp
    private long timestamp;

    private String username;
    private String remoteAddress;

    //omitted getters and setters
Run Code Online (Sandbox Code Playgroud)

我避免扩展,DefaultRevisionEntity因为我更改了@Id @Generated value以便利用自动增量(我正在使用 Mysql)。

尽管如此,使用spring.jpa.hibernate.ddl-auto: validateHibernate时,即使不使用,也需要表的存在。事实上,根据我的配置,Hibernate 使用我的自动增量 id,并且该表hibernate_sequence永远不会更新。

如何禁用表的创建/需要hibernate_sequence?如果我不能,这可能是一个错误吗?

小智 1

谢谢你的帖子。它帮助我找到了消除(自动)生成 hibernate_sequence 表的解决方案。我的解决方案如下。请注意,我使用了@GeneratedValue(strategy = GenerationType.IDENTITY),这可能就是您正在寻找的。无论如何,这是我想出的课程。

@Entity(name = "EnversRevinfo")
@Table(name = "z_envers_revinfo")
@RevisionEntity( EnversRevinfo.EnversRevisionEntityListener.class)
public class EnversRevinfo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @RevisionNumber
    private int id;

    @RevisionTimestamp
    private long timestamp;

    @Transient
    public Date getRevisionDate() {
        return new Date( timestamp );
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public static class EnversRevisionEntityListener implements RevisionListener {

        public void newRevision( Object revisionEntity ) {
            @SuppressWarnings("unused")
            EnversRevinfo enversRevinfo =
                    ( EnversRevinfo ) revisionEntity;
        }
    }

    @Override
    public boolean equals(Object o) {
        if ( this == o ) {
            return true;
        }
        if ( !(o instanceof EnversRevinfo) ) {
            return false;
        }

        final EnversRevinfo that = (EnversRevinfo) o;
        return id == that.id
                && timestamp == that.timestamp;
    }

    @Override
    public int hashCode() {
        int result;
        result = id;
        result = 31 * result + (int) (timestamp ^ (timestamp >>> 32));
        return result;
    }

    @Override
    public String toString() {
        return "DefaultRevisionEntity(id = " + id
                + ", revisionDate = " + DateFormat.getDateTimeInstance().format( getRevisionDate() ) + ")";
    }
}
Run Code Online (Sandbox Code Playgroud)