2013-04-07 136 views
2

我有一个非常奇怪的问题,目前休眠。 不知何故在一张桌子上,它创建一个引用自身的外键。该列也是主键。这基本上阻止我从该表中删除任何行。休眠创建自己的外键

在日志中我可以看到一行:

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; 
} 

回答

2

事实证明,在设备实体引用的实体类“位置”之一中,它具有@ManyToMany映射的设备集合,其实际应该是@OneToMany。 更改@ManyToMany to @OneToMany后,约束消失。

0

我没有在您的代码中看到Device类的引用。所以我假设这个类已被修改,但它的表没有,因为它有一些数据。 (为什么还应该有一个外键自己?)

尝试删除此表在您的数据库中,使休眠再次创建它,或设置p.hibernate.hbm2ddl.autocreate-drop

+0

日志是在hibernate导出方案时生成的。我试图先删除数据库,但仍然是相同的。 – Wudong 2013-04-07 06:41:43

+0

ü是正确的,它已被修改,它确实有一个自我引用在一列(树状结构),我丢弃了。但我不确定它为什么会发生,现在即使在添加列后,限制仍然存在。 – Wudong 2013-04-07 06:45:02

+0

@Wudong当你删除表(首先需要为空)时,hibernate在你的模式中找不到它。所以它在服务器启动时创建表。完成这些步骤后,您的表格不能有自己的外键。我在问1)你丢了桌子吗? 2)Hibernate是否再次创建它? 3)它是否被正确创建? – 2013-04-07 09:59:38