我现在有一个非常奇怪的冬眠问题。
它以某种方式在表上创建引用自己的外键。该列也是主键。这从本质上阻止了我从该表中删除任何行。

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

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

最佳答案

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

10-07 16:58
查看更多