提问者:小点点

Hibernate Envers审计联接表防御


我想给我的实体添加历史,我正在和冬眠的Envers一起玩。

我用对应的5个表定义了Handbook章节类:HANDBOOKHANDBOOK_AUDCHAPTERCHAPTER_AUDREVINFO

如果两个实体之间没有连接,一切都很好,但是当我为HANDBOOKCHPATER添加oneTo多关系时,应用程序无法启动,因为缺少HANDBOOK_CHAPTER_AUD表。

考虑拥有JoinTable绝对没问题,但问题是应该如何定义它。

手册实体:

@Entity
@Audited
@Getter
@Setter
@NoArgsConstructor
public class Handbook {

    @Id
    @SequenceGenerator(name = "HANDBOOK_ID_SEQUENCE", sequenceName = "HANDBOOK_ID_SEQUENCE", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HANDBOOK_ID_SEQUENCE")
    private Long id;
    private String title;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "HANDBOOK_ID")
    @AuditJoinTable(name = "REV_HANDBOOK_CHAPTER")
    private Set<Chapter> chapters;

}

章节实体:

@Entity
@Audited
@Getter
@Setter
@NoArgsConstructor
public class Chapter {

    @Id
    @SequenceGenerator(name = "CHAPTER_ID_SEQUENCE", sequenceName = "CHAPTER_ID_SEQUENCE", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CHAPTER_ID_SEQUENCE")
    private Long id;
    private String name;

    @Column(name = "HANDBOOK_ID")
    private Long handbookId;

}

桌子设计:

<createTable tableName="REVINFO">
    <column name="rev" type="integer">
        <constraints primaryKey="true" nullable="false"/>
    </column>
    <column name="revtstmp" type="bigint"/>
</createTable>

<!-- Hibernate Envers need this seq exact to increase the revision number for versioned entities-->
<createSequence sequenceName="HIBERNATE_SEQUENCE"
                startValue="1"
                incrementBy="1"/>

<createTable tableName="HANDBOOK">
    <column name="ID" type="bigint">
        <constraints primaryKey="true" nullable="false"/>
    </column>
    <column name="TITLE" type="varchar2(128 char)"/>
</createTable>

<createTable tableName="REV_HANDBOOK">
    <column name="ID" type="bigint"/>
    <column name="TITLE" type="varchar2(128 char)"/>

    <column name="REV_ID" type="integer">
        <constraints foreignKeyName="FK_HANDBOOK_REV"
                    references="REVINFO(REV)"/>
    </column>
    <column name="REV_TYPE" type="smallint"/>
</createTable>

<!--    CHAPTER TABLES    -->
<createTable tableName="CHAPTER">
    <column name="ID" type="bigint">
        <constraints primaryKey="true" nullable="false"/>
    </column>
    <column name="NAME" type="varchar2(128 char)"/>
    <column name="HANDBOOK_ID" type="integer">
        <constraints foreignKeyName="FK_CHAPTER_HANDBOOK_ID"
                     references="HANDBOOK(ID)"/>
    </column>
</createTable>

<createTable tableName="REV_CHAPTER">
    <column name="ID" type="bigint"/>
    <column name="NAME" type="varchar2(128 char)"/>
    <column name="HANDBOOK_ID" type="integer">
        <constraints foreignKeyName="FK_CHAPTER_AUD_HANDBOOK_ID"
                     references="HANDBOOK(ID)"/>
    </column>

    <column name="REV_ID" type="integer">
        <constraints foreignKeyName="FK_CHAPTER_REV"
                     references="REVINFO(REV)"/>
    </column>
    <column name="REV_TYPE" type="smallint"/>
</createTable>

注意:我根据hibernate envers留档编辑了一些命名:

  org:
    hibernate:
      envers:
        audit_table_prefix: REV_
        audit_table_suffix: ~  # No suffix
        revision_field_name: REV_ID
        revision_type_field_name: REV_TYPE

共1个答案

匿名用户

我根据hibernate在运行代码后给我的一系列错误找到了一个解决方案。以下是我如何defiend修订连接表:

    <createTable tableName="REV_HANDBOOK_CHAPTER">
        <column name="ID" type="bigint"/>
        <column name="REV_ID" type="integer">
            <constraints foreignKeyName="FK_REV_HANDBOOK_CHAPTER_REV"
                         references="REVINFO(REV)"/>
        </column>
        <column name="HANDBOOK_ID" type="bigint">
            <constraints foreignKeyName="FK_REV_HANDBOOK_CHAPTER_HANDBOOK"
                         references="HANDBOOK(ID)"/>
        </column>
        <column name="REV_TYPE" type="smallint"/>
    </createTable>