目前我对hibernate有一个非常奇怪的问题。 不知何故,在表上,它创建了一个引用自身的外键。该列也是主键。这实际上阻止我删除该表中的任何行。
在日志中我可以看到一行:
DEBUG org.hibernate.SQL - alter table Device add index FK79D00A76C682495E(id),添加约束FK79D00A76C682495E外键 (id)引用设备(id)
其他类似表的表似乎没问题。这似乎适用于MySQL和Derby。我正在使用hibernate 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;
}
答案 0 :(得分:4)
事实证明,在Device实体引用的Entity Class“Location”之一中,它有一个@ManyToMany
映射的Device集合,它应该是@OneToMany
。
更改后@ManyToMany to @OneToMany
约束消失。
答案 1 :(得分:0)
我在代码中看不到对Device
类的引用。所以我假设这个类已被修改,但它的表没有,因为它有一些数据。 (为什么它本身应该有一个外键?)
尝试在数据库中删除此表以使hibernate再次创建它,或将p.hibernate.hbm2ddl.auto
设置为create-drop
。