10

関連する 2 つのクラスに JPA アノテーションが付けられています。アラームとステータス。1 つのアラームは 1 つのステータスを持つことができます。

必要なのは、1 つのステータスを削除し、削除されたそのステータスにあるアラームに null 値を「伝播」できるようにすることです。

つまり、外部キーを「on delete set null」として定義する必要があります。

@Entity
public class Alarm {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
    @SequenceGenerator(name="sequence", sequenceName="alarm_pk_seq")
    private Integer id;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="idStatus")
    private Status status;

    // get/set
}

@Entity
public class Status {
    @Id
    @Column(name="idStatus")
    private Integer id;

    private String description;

    // get/set
}

例:

前:

STATUS
id  description
1   new
2   assigned
3   closed

ALARMS
id  status
1   1
2   2
3   2

After (id=2のステータスを削除)

STATUS
id  description
1   new
3   closed

ALARMS
id  status
1   1
2   NULL
3   NULL

Hibernate と PostgreSQL を使用して、ソース コードからデータベースを自動的に生成しています。可能なすべての CascadeType を試しましたが、成功しませんでした。

コードに何か問題がありますか? JPAでそれを行うことは可能ですか?

4

5 に答える 5

3

Hibernate アノテーションを使用して追加するだけです。

@OnDelete(action=OnDeleteAction.CASCADE)

「ON UPDATE NO ACTION ON DELETE CASCADE;」として外部キーを生成します。

しかし、action=OnDeleteAction.SET_NULL はありません。

さらに、可能であれば自分のコードを Hibernate に結び付けたくありません (しかし、それが機能するのであれば、私はそれと一緒に暮らすことができます)。

このスレッドはそれについて議論します。JPA (または Hibernate 拡張機能) に外部キーを生成する簡単な方法がないとは信じられません。

于 2009-01-25T15:36:28.313 に答える
1

他の非休止状態の実装については知りませんが、これは休止状態でこれについて追跡している JIRA の問題です...

http://opensource.atlassian.com/projects/hibernate/browse/HHH-2707

于 2009-06-09T06:55:38.310 に答える
-1

OpenJPAには

@ForeignKey(deleteAction=ForeignKeyAction.NULL)

しかし、これを行うための標準的な JPA の方法はありません (明らかに、Hibernate では不可能です)。

JDOに戻りたくなる。

于 2012-10-15T20:19:43.100 に答える