2016-07-25 5 views
1

(双方向)春データJPAで削除カスケード:私は2つのエンティティクラスの間に次の双方向の関係を持っている

ユーザー

@Entity 
@Table(name = "USER") 
public class User { 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
    @Cascade({CascadeType.REMOVE, CascadeType.SAVE_UPDATE}) 
    private Set<Book> books; 
} 

を本

@Entity 
@Table(name = "BOOKS") 
public class Book { 
    @ManyToOne(optional = false) 
    @JoinColumns({ 
      @JoinColumn(name = "ID", referencedColumnName = "ID"), 
      @JoinColumn(name = "NAME", referencedColumnName = "NAME"), 
    }) 
    private User user; 

}

私がダウンして、ユーザーに関連付けられているすべての書籍に削除カスケードでUserを削除したいです。私は春データCrudRepository使用する場合ただし、:

myDAO.delete(String userId) // interface extending CrudRepository<User, UserPK> 

を私が取得しています:私はorhpanRemovalを使用しようとしていた

Caused by: org.hsqldb.HsqlException: integrity constraint violation: foreign key no action; FK_IN88FEHUXOOYQK0YE71USPIEP table: USER 

CascadeTypes両方org.hibernatejavax.persistenceのすべての種類。私は@Query(Delete from User....)のようなネイティブクエリを実装したくありません私は直接例外カスケードオプションを指定するかどうかは、例外文外部キーのないアクションかどうか疑問に思っています。

+0

データベーススキーマはどのように生成されますか? 'Book'から' User'まで '@Cascade(CascadeType.REMOVE)'を持っているのはなぜですか?確かに、そのブックを削除したときに(またはあなたの) 'カスケード(Cascade) 'が行うことになるので、'ブック(Book)'を持つ 'User'sをすべて削除したくないのです。 – manish

+0

こんにちは@manish、私はBookからカスケードを削除しましたが、何も変更されていません。スキーマは、私はSQLスクリプトのいずれかを使用していないとして、私は "更新"に設定されているフラグ "hibernate.hbm2ddl.auto"でLocalContainerEntityManagerFactoryBeanを作成しています。 – ServerSideCat

答えて

0

BookからUserまでの多対1の関係があります。したがって、Bookテーブルでは、Userテーブルへの外部キーを取得するために1つの列のみが必要です。

コード:

@ManyToOne(optional = false) 
@JoinColumns({ 
     @JoinColumn(name = "ID", referencedColumnName = "ID"), 
     @JoinColumn(name = "NAME", referencedColumnName = "NAME"), 
}) 
private User user; 

は、単に次のようになります。

@ManyToOne(optional = false) 
@JoinColumn(name = "user_id") 
private User user; 

あなたが休止状態スキーマ生成ツール(HBM2DDL)を使用すると、以下のように、外部キー制約が生成されます。

ALTER TABLE 
    BOOK 
ADD CONSTRAINT 
    FK_IN88FEHUXOOYQK0YE71USPIEP 
FOREIGN KEY 
    (USER_ID) REFERENCES USER (ID) 
ON UPDATE NO ACTION 
ON DELETE NO ACTION; 

通知ON DELETE NO ACTION。つまり、Userインスタンスが削除されると、Bookインスタンスに関連付けられているインスタンス(NO ACTION)は何も起こらないはずです。これは実際には、Userを削除することを許可しないことを意味します。

あなたはUserが削除されたときに削除するUserに関連したBookインスタンスをしたい場合は、DDLは次のようになります。

ALTER TABLE 
    BOOK 
ADD CONSTRAINT 
    FK_IN88FEHUXOOYQK0YE71USPIEP 
FOREIGN KEY 
    (USER_ID) REFERENCES USER (ID) 
ON UPDATE NO ACTION 
ON DELETE CASCADE; 

これはドメインモデルへのHibernate固有のアノテーションを追加することによって生成することができます。

class User { 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
    @Cascade({CascadeType.REMOVE, CascadeType.SAVE_UPDATE}) 
    @OnDelete(OnDeleteAction.CASCADE) 
    private Set<Book> books; 
} 
関連する問題