【问题标题】:Hibernate - Envers Writes Wrong Data to AUD ColumnHibernate - Envers 将错误的数据写入 AUD 列
【发布时间】:2019-07-13 01:05:05
【问题描述】:

我遇到了 Envers 的问题。我有两个实体,CITY 和 CITY_I18N。 通过 CITY 实体的“CODE”列,它们之间存在“一对多”关系。 当我尝试保存 CityI18N 实体时,操作成功结束,但 CITY_I18N_AUD 表中的记录包含错误值,Envers 写入 CITY 实体的“ID”列,而不是真正的外键,“CODE”列。

我该如何解决这个问题?

提前致谢。

@Entity
@Audited
public class City  {

    @Id
    @SequenceGenerator(name = "CITY_ID_GENERATOR", sequenceName = "SEQ_CITY")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CITY_ID_GENERATOR")
    private Long ID;

    @Column(name = "CODE")
    private String code;

    @OneToMany(mappedBy = "city", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
    @Fetch(value = FetchMode.SUBSELECT)
    @NotAudited
    private List<CityI18n> cityI18ns;
}

@Entity
@Table(name="CITY_I18N")
@Audited
public class CityI18n {

    @Id
    @SequenceGenerator(name="CITY_I18N_ID_GENERATOR", sequenceName="SEQ_APPLICATION")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CITY_I18N_ID_GENERATOR")
    private Long ID;

    private String name;

    @ManyToOne
    @JoinColumn(name = "LANGUAGE_CODE", referencedColumnName="CODE")
    private Language language;

    @ManyToOne
    @JoinColumn(name = "CITY_CODE", referencedColumnName="CODE")
    private City city;
}

【问题讨论】:

  • 我只能在这里说的是,这可能是不正确处理referencedColumnName 的错误,因为这不是本示例中的标准。但是我之前没有看到任何类似的报告,所以我认为它不会在未来的某些版本中得到修复。
  • 嗨 Adam,其实在 stackowerflow 上有一个类似的帖子,stackoverflow.com/questions/15340382/… 还创建了一个 jira 记录,hibernate.onjira.com/browse/HHH-8066

标签: java hibernate hibernate-envers


【解决方案1】:

这是一个老问题,但我最近遇到了同样的问题,Envers yet 似乎仍未解决。

我的解决方案是让 Envers 将来自@Id 列的数据写入_AUD 表的referencedColumnName 列。

似乎可以很好地重建关系。

唯一的障碍是手动更改_AUD表中列的SQL数据类型:

CREATE TABLE CITY_AUD (
    ID int8 NOT NULL,
    REV int8 NOT NULL,
    REVTYPE int2,
    REVEND int8,   -- if you are using ValidityAuditStrategy
    CODE varchar(255),
    PRIMARY KEY (ID, REV)
);

CREATE TABLE CITY_I18N_AUD (
    ID int8 NOT NULL,
    REV int8 NOT NULL,
    REVTYPE int2,
    REVEND int8,   -- if you are using ValidityAuditStrategy
    NAME varchar(255),
    CITY_CODE int8, -- Notice the type is int8 here - it will actually hold the CITY.ID not CITY.CITY_CODE
    LANGUAGE_CODE int8, -- assuming it's the same situation for LANGUAGE (wasn't clear from the question)
    PRIMARY KEY (ID, REV)
);

这可能不适用于所有用例,但至少可以保持关系完好无损。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2018-12-02
    • 2012-07-05
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2011-07-30
    相关资源
    最近更新 更多