【发布时间】: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