4

休止状態は、JoinTable(List <>)で複合主キーを宣言します


HQL(Hibernateクエリ言語)を使用してサイドテーブルで複合主キーを宣言するにはどうすればよいですか?以前、クラスで1つの結合可能宣言を取得しましたが、すべてが正常に機能し、2つの列の複合主キーが作成されました。これは私が使用したコードです:

変更前(作業済み)

@Id
@SequenceGenerator(name="someSequence", sequenceName="SEQ_APP", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="appSequence")
@Column(name="id")
private int setting_id;

@OneToOne
private User user;

@ManyToMany
@JoinTable(
        name="tbl_settings_objectproxy",
        joinColumns = @JoinColumn(name = "id"),
        inverseJoinColumns = @JoinColumn( name = "objectproxy_id")
)
private Set<SomeObject> objectproxy;

今、私はすべてを精査し、セットをリストに変更し、別のサイドテーブルを追加しました。これで、hibernateは想定どおりに2つのサイドテーブルを作成しますが、主キーを宣言しません...これを修正する方法を知っている人はいますか?これは私の新しいコードです:

AFTER(複合主キーは作成されなくなり、主キーも宣言されなくなります)

@Id
@SequenceGenerator(name="someSequence", sequenceName="SEQ_APP", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="appSequence")
@Column(name="id")
private int setting_id;

@OneToOne
private User user;


@ManyToMany
@JoinTable(
    name="tbl_settings_objectproxy",
    joinColumns = @JoinColumn(name = "id"),
    inverseJoinColumns = @JoinColumn( name = "objectproxy_id")
    )
private List<SomeObject> objectProxyForSomething;
4

1 に答える 1

6

回答/解決策:

  1. List<>をSet<>に変更する と、この状況ですべての魔法が実行されます。

  2. HQLを使用して手動でテーブルを作成できます。

  3. Listを使用することに固執する場合、「columnDefinition」を使用して(単一の)主キーを宣言する 方法しかわかりません。次のように「@UniqueConstraint」アノテーションを使用して一意性制約を設定することで、両方の列を一緒に一意に設定できます

@ManyToMany
@JoinTable(
    name="tbl_settings_objectproxy_for_something",
    joinColumns = @JoinColumn(name = "id", columnDefinition = "int primary key"),
    inverseJoinColumns = @JoinColumn( name = "objectproxy_id")
    uniqueConstraints = {@UniqueConstraint(columnNames={"id", "objectproxy_id"})}
    )
private List<SomeObject> SomeObjectProxy;

それらが彼の解決策であるため、JB Nizetのコメントに投票しますが、彼は答えではなくコメントでそれらを与えました。

于 2012-05-31T14:08:27.830 に答える