2013-04-07 186 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