休眠创建自己的外键
问题描述:
我有一个非常奇怪的问题,目前休眠。 不知何故在一张桌子上,它创建一个引用自身的外键。该列也是主键。这基本上阻止我从该表中删除任何行。休眠创建自己的外键
在日志中我可以看到一行:
DEBUG org.hibernate.SQL - 改变表设备添加索引 FK79D00A76C682495E(ID),加约束FK79D00A76C682495E外键 (ID)的参考设备(ID )
其他类似的表似乎很好。这对于MySQL和Derby来说似乎都是如此。我正在使用休眠4.1.4
注释的类如下所示。
@Entity(name = "Device")
public class Device extends DomainObject implements Searchable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected long id;
@Column(name = "Type")
@Enumerated(EnumType.STRING)
private DeviceTypeEnum type = DeviceTypeEnum.AccessControlDevice;
@Column(name = "Name", length = Constance.DATABASE_NAME_FIELD_LENGTH)
private String name;
@Column(name = "Description", length = Constance.DATABASE_DESCRIPTION_FIELD_LENGTH)
private String description;
@Column(name = "Identifier", length = Constance.DATABASE_IDENTIFIER_FIELD_LENGTH, unique = true)
private String identifier;
@ManyToMany
@JoinTable(name = "Device2Group", joinColumns = {@JoinColumn(name = "DeviceID")}, inverseJoinColumns = {@JoinColumn(name = "DeviceGroupID")})
private List<DeviceGroup> groups = new ArrayList<DeviceGroup>();
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "location")
private Location location;
@ManyToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "Address")
private Address address;
@ManyToOne
@JoinColumn(name = "Link", nullable = false)
private Link link;
}
答
事实证明,在设备实体引用的实体类“位置”之一中,它具有@ManyToMany
映射的设备集合,其实际应该是@OneToMany
。 更改@ManyToMany to @OneToMany
后,约束消失。
答
我没有在您的代码中看到Device
类的引用。所以我假设这个类已被修改,但它的表没有,因为它有一些数据。 (为什么还应该有一个外键自己?)
尝试删除此表在您的数据库中,使休眠再次创建它,或设置p.hibernate.hbm2ddl.auto
至create-drop
。
日志是在hibernate导出方案时生成的。我试图先删除数据库,但仍然是相同的。 – Wudong 2013-04-07 06:41:43
ü是正确的,它已被修改,它确实有一个自我引用在一列(树状结构),我丢弃了。但我不确定它为什么会发生,现在即使在添加列后,限制仍然存在。 – Wudong 2013-04-07 06:45:02
@Wudong当你删除表(首先需要为空)时,hibernate在你的模式中找不到它。所以它在服务器启动时创建表。完成这些步骤后,您的表格不能有自己的外键。我在问1)你丢了桌子吗? 2)Hibernate是否再次创建它? 3)它是否被正确创建? – 2013-04-07 09:59:38