【问题标题】:Envers audit table creates a foreign key to and prevents deletion from another tableEnvers 审计表创建一个外键并防止从另一个表中删除
【发布时间】:2014-12-23 22:58:15
【问题描述】:

这是我的情况。 3 个实体:客户、地址和客户地址。我使用 Hibernate 的模式构建器来创建我的数据库表(普通表和审计表)。 Customer 与 Address 存在多对多关系,这种关系由 CustomerAddress 实体定义。

客户类别

@Entity
@Audited
public class Customer implements Serializable
{
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private Long id;
   ...
   @Audited(targetAuditMode = NOT_AUDITED)
   @OneToMany(fetch=FetchType.LAZY)
   @JoinColumn(name = "customerId", foreignKey = @ForeignKey(name="FK_CustomerToAddress_Customer"))
   private List<CustomerAddress> addresses = new ArrayList<>();
}

地址类

@Entity
@Audited
public class Address implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    ...
}

客户地址类

@Entity
@Audited
@Table(name = "CustomerToAddress")
@AssociationOverrides({
@AssociationOverride(name = "pk.customer",
    joinColumns = @JoinColumn(name = "customerId")),
@AssociationOverride(name = "pk.address",
    joinColumns = @JoinColumn(name = "addressId"))
})
public class CustomerAddress implements Serializable
{
    @EmbeddedId
    private CustomerAddressId pk = new CustomerAddressId();
    ...
}

CustomerAddressId 类

public class CustomerAddressId implements Serializable
{
    @ManyToOne
    private Address address;
    @ManyToOne
    private Customer customer;
    ...
}

现在,当我创建一个客户、一个地址和一个客户地址关系时,一切都很好,直到我尝试执行删除。我可以很好地删除 CustomerAddress 记录,但如果我尝试删除链接的地址记录,我会收到如下外键违规错误:

DELETE 语句与 REFERENCE 约束“FK_NAME”冲突。冲突发生在数据库“DB_NAME”、表“dbo.CustomerToAddress_AUD”、列“addressId”中。

所以,CustomerToAddress_AUD 表已经为地址表创建了一个 FK,我将永远无法使用 hibernate/JPA 以编程方式删除地址。

关于如何创建不会阻止删除链接实体的审核多对多关系的任何想法?

编辑: 导出schema的代码如下:

Configuration config = new Configuration();
// set connection properties on config
config.configure();
SchemaExport sexport = new EnversSchemaGenerator(config).export();
sexport.execute(false, true, false, true); // args: script, export, justDrop, justCreate 

【问题讨论】:

  • 您是如何生成架构的? Envers 不应以任何方式 影响“正常”模式,因此绝对不应发生诸如“CustomerToAddress_AUD 表已创建地址的 FK”之类的事情。
  • 使用相关代码更新问题。谢谢!
  • 这绝对不应该发生,看起来像一个错误,但不知道在哪里。我会在 Hibernate 的 JIRA 中报告它,抱歉我帮不上忙。

标签: hibernate hibernate-envers


【解决方案1】:

从 Hibernate 5.2.7 开始,这仍然是一个问题。我创建了一个 JIRA HHH-11463

更新

从 5.2.11 开始,此问题已修复。

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 2018-09-19
    • 2020-05-14
    • 1970-01-01
    • 2012-09-10
    • 2021-10-07
    • 1970-01-01
    • 2015-02-22
    相关资源
    最近更新 更多