【问题标题】:Hibernate Envers includes column in primary key even when they column is not key in main tableHibernate Envers 在主键中包含列,即使它们的列不是主表中的键
【发布时间】:2019-01-25 09:06:38
【问题描述】:

在这种情况下:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.envers.Audited;

@Entity
@Audited
public class TestEntity implements Serializable {

    @Id
    private Long id;

    @ElementCollection
    private List<String> strings = new ArrayList<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public List<String> getStrings() {
        return strings;
    }

    public void setStrings(List<String> strings) {
        this.strings = strings;
    }
}

Hibernate 按预期创建两个表:

创建表testentity ( id bigint(20) 非空, 主键 (id) ) ENGINE=InnoDB 默认字符集=utf8;

创建表testentity_strings ( TestEntity_id bigint(20) 非空, strings varchar(255) 默认为空, 键FK6gvnp6uhj6p14qb8jr7w4a4sc (TestEntity_id), 约束 FK6gvnp6uhj6p14qb8jr7w4a4sc 外键 (TestEntity_id) 参考 testentity (id) ) ENGINE=InnoDB 默认字符集=utf8;

Envers 还创建了两个表:

创建表testentity_aud ( id bigint(20) 非空, revision int(11) 非空, action tinyint(4) 默认为空, 主键 (id,revision), 键FKtoml4ns3581arnt5f7i1srxai (revision), 约束 FKtoml4ns3581arnt5f7i1srxai 外键 (revision) 参考 revinfo (REV) ) ENGINE=InnoDB 默认字符集=utf8;

创建表testentity_strings_aud ( revision int(11) 非空, TestEntity_id bigint(20) 非空, strings varchar(255) 非空, action tinyint(4) 默认为空, 主键 (revision,TestEntity_id,strings), 约束 FKadlc041c3dxra6fmfxsku0fuh 外键 (revision) 参考 revinfo (REV) ) ENGINE=InnoDB 默认字符集=utf8;

问题在于第二个审计表(testentity_strings)。即使在主表中的字符串允许为空,它也会在“字符串”列上设置一个约束(非空)。

我的业务需求是允许空字符串。如何在环境中覆盖此行为?

【问题讨论】:

    标签: java hibernate hibernate-envers


    【解决方案1】:

    Nanos- 是否可以使用订单列(如果提供)作为主键而不是元素值,因为这也是我项目的源点。 谢谢

    【讨论】:

      【解决方案2】:

      简短的回答是你不能。

      Envers 处理元素集合的方式与 ORM 不同。相反,Envers 为该元素集合构建了一个完全独立的实体映射,并通过 HBM 将所述映射提供给 ORM。

      我们这样做有几个原因,但主要原因是它允许用户配置映射,以便可以审计元素集合,而拥有实体的其余部分则没有。而且因为我们提供的映射是集合的实体映射,HBM 要求我们必须为 ORM 提供主键配置。

      从 Envers 的角度来看,我们不可能从主键中排除字符串值,因为您将在集合中拥有多个与同一修订号相关联的值,因此某些值必须相应地区分表中的不同行。

      也就是说,我能看到的唯一解决方法是使用 @OneToMany 并将您的字符串包装在带有生成 ID 的实际实体映射中,而不是 @ElementCollection(如果需要审核值)。

      如果您认为这些值不值得审核,那么您可以将 @NotAudited 放在元素集合上以绕过该问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        相关资源
        最近更新 更多