2016-08-28 6 views
0

2つのエンティティカテゴリとパブリケーションがあります。私がここで持っている関係は、すべての出版物がカテゴリーを持っているということです。私は出版レコードを削除すると、このHibernate、外部キー制約が存在する場合に親行を削除します。

create table category(
id INTEGER not null auto_increment, 
name varchar(255) not null, 
primary key (id) 
); 


CREATE TABLE PUBLICATION(
ID INTEGER NOT NULL AUTO_INCREMENT, 
TITLE varchar(255) NOT NULL, 
CONTENT VARCHAR(1000) NOT NULL, 
CATEGORY_ID INTEGER NOT NULL, 
primary key(ID), 
foreign key (CATEGORY_ID) references CATEGORY (ID) 
); 

とエンティティのような

何かが

package com.java.bricks.entity; 

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="CATEGORY") 
public class CategoryEntity implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public Long categoryId; 

    @Column(name="NAME") 
    public String categoryName; 


    public Long getCategoryId() { 
     return categoryId; 
    } 
    public void setCategoryId(Long categoryId) { 
     this.categoryId = categoryId; 
    } 
    public String getCategoryName() { 
     return categoryName; 
    } 
    public void setCategoryName(String categoryName) { 
     this.categoryName = categoryName; 
    } 



} 

package com.java.bricks.entity; 

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 



    @Entity 
    @Table(name="PUBLICATION") 
    public class PublicationEntity implements Serializable { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     @Id 
     @Column(name="ID") 
     @GeneratedValue(strategy=GenerationType.AUTO) 
     private Long publicationId; 

     @Column(name="TITLE") 
     private String title; 

     @Column(name="CONTENT") 
     private String content; 


     @OneToOne 
     @JoinColumn(name="CATEGORY_ID") 
     private CategoryEntity category; 


     public Long getPublicationId() { 
      return publicationId; 
     } 
     public void setPublicationId(Long publicationId) { 
      this.publicationId = publicationId; 
     } 
     public String getTitle() { 
      return title; 
     } 
     public void setTitle(String title) { 
      this.title = title; 
     } 
     public String getContent() { 
      return content; 
     } 
     public void setContent(String content) { 
      this.content = content; 
     } 
     public CategoryEntity getCategory() { 
      return category; 
     } 
     public void setCategory(CategoryEntity category) { 
      this.category = category; 
     } 



    } 

とカテゴリのエンティティオブジェクト、出版レコードが正常に削除されます。これはうまく動作します。しかし、今私が望むのは、カテゴリレコードを削除するときに、カテゴリレコード(親)とパブリケーションテーブル内のすべての外部キーレコードも削除する必要があるということです。

どうすればいいですか?私はカスケードしました。しかし、私はまだ同じエラーが発生します。

また、外部キーレコードを持っているときにカテゴリを削除する権限をユーザーに与えることは正しいですか?それは、この例で行うことができますかYESの場合

おかげ

+0

あなたがcascade.allを試したとしたら、それをカテゴリまたはパブリケーションに追加しましたか? –

+0

パブリケーションにカスケードを追加しました。カテゴリー内にパブリケーションインスタンスがありません。そこで追加しませんでした。パブリケーション – user641887

答えて

1

Hibernateは通常、エンティティ全体のグラフをスキャンするのではなく、削除取得されたクラスでのみ見ていきます。そのクラスに明示的なリンクがない場合、何もしません。 CategoryにはFKがないので、annotationのmappedByプロパティを使用すると、その名前のインスタンス変数が検索されます。インスタンス変数を見つけると、エンティティ間の関係について推論することができます。

カスケードは、このエンティティからマップされたエンティティにどのような操作が流れるかを考えてください。カテゴリエンティティを削除すると、パブリケーションマッピングが調べられ、削除がそのパブリケーションにカスケードする必要があることがわかります。

package com.java.bricks.entity; 

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="CATEGORY") 
public class CategoryEntity implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public Long categoryId; 

    @Column(name="NAME") 
    public String categoryName; 

    @OneToOne(mappedBy="category", cascade = CascadeType.ALL) 
    private Publication publication;  

    public Long getCategoryId() { 
     return categoryId; 
    } 
    public void setCategoryId(Long categoryId) { 
     this.categoryId = categoryId; 
    } 
    public String getCategoryName() { 
     return categoryName; 
    } 
    public void setCategoryName(String categoryName) { 
     this.categoryName = categoryName; 
    } 



} 
+0

にカスケードを追加しましたが、これはカテゴリとパブリケーションの関係を双方向として設定していませんか?あなたが今言ったことをすれば、それは真実な陳述であろう。また、双方向または単方向の1対1マッピングの推奨プラクティスは何ですか? – user641887

+0

今のところ、関係は一方向です(カテゴリへのパブリケーション)。カテゴリにマッピングを追加すると、双方向になります。私はすぐにそれを必要としなくても、常にマッピングを追加します。エンティティは、忘れた場合の関係を文書化します。 –

+0

ありがとうございました.. – user641887

関連する問題