3

現在、休止状態に非常に奇妙な問題があります。どういうわけか、テーブルで、それ自体を参照する外部キーを作成します。列は主キーでもあります。これにより、基本的に、そのテーブルから行を削除できなくなります。

ログに次の行が表示されました。

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

2 に答える 2

4

デバイスエンティティが参照するエンティティクラス「場所」の1つに、デバイスの@ManyToManyマップされたコレクションがあることがわかり@OneToManyました。変更後@ManyToMany to @OneToMany、制約は消えます。

于 2013-04-25T16:10:58.110 に答える
0

Deviceコードにクラスへの参照がありません。したがって、このクラスは変更されていると想定していますが、データがあるため、テーブルは変更されていません。(それ以外に、それ自体への外部キーが必要な理由は何ですか?)

このテーブルをデータベースにドロップして、休止状態にもう一度作成させるか、に設定p.hibernate.hbm2ddl.autoしてみてくださいcreate-drop

于 2013-04-07T04:59:28.320 に答える