2016-08-29 12 views
1

コンポーネントオブジェクトがcomponentMetaオブジェクトにマップされていますが、cascade(javax.persistence.CascadeType)アクション=すべてを設定しましたが、データベース内のリレーションシップアクションはRestrict(カスケードに更新されません)jpaエンティティはデータベース内のアクションを更新しません

@Entity 
@Table(name = "component") 
public class Component { 

private int      idComponent; 
private List<ComponentMeta>  componentMetas; 

public Component() { 
} 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public int getIdComponent() { 
    return this.idComponent; 
} 

public void setIdComponent(int idComponent) { 
    this.idComponent = idComponent; 
} 

@OneToMany(mappedBy = "component", cascade = CascadeType.ALL) 
public List<ComponentMeta> getComponentMetas() { 
    return this.componentMetas; 
} 

public void setComponentMetas(List<ComponentMeta> componentMetas) { 
    this.componentMetas = componentMetas; 
} 
} 

そしてComponentMetaオブジェクト:

@Entity 
@Table(name = "ComponentMeta") 
public class ComponentMeta { 

private int idComponentMeta; 
private Component component; 

public ComponentMeta() { 
} 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "idComponentMeta", unique = true, nullable = false) 
public int getIdComponentMeta() { 
    return idComponentMeta; 
} 

public void setIdComponentMeta(int idComponentMeta) { 
    this.idComponentMeta = idComponentMeta; 
} 

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "idComponent") 
public Component getComponent() { 
    return component; 
} 

public void setComponent(Component component) { 
    this.component = component; 
} 
} 
ここ

は、コンポーネントオブジェクトです

、データベースに関係のアクションに関する画像(カスケードに更新されません)があります。 enter image description here

春ブーツで私の休止状態の設定(application.properties):

spring.jpa.show-sql = true 
spring.jpa.hibernate.ddl-auto = update 
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 

なぜ関係アクションはカスケードに自動更新されませんか?

+2

JPA関係注釈の「カスケード」フラグは、外部キーがどのように生成されるかとは関係ありません。彼らは、JP Aプロバイダが永続性/更新/削除などを処理する方法に関連しています –

+0

ああ、助けてくれてありがとう: –

答えて

2

あなたが外部キーでON DELETE CASCADEを生成するために、冬眠したい場合は、あなたが@OneToMany側の@OnDeleteを配置する必要があります:あなたは両方で子どもと親を関連付けない限り、JPAで

@OneToMany(mappedBy = "component", cascade = CascadeType.ALL) 
@OnDelete(action = OnDeleteAction.CASCADE) 
+0

多くのありがとう、それは今働いています^^ –

1

関係は、常に一方向性で行き方。親から子へのREMOVE操作のカスケード接続には、親から子へのリレーションが必要です(反対側だけでなく)。

そのため、これを実行する必要があります

のどちらかが、双方向@ManyToOne、@OneToManyまたは単方向への一方向の@ManyToOne関係を変更します。次に、REMOVE操作をカスケードして、EntityManager.removeが親と子を削除するようにします。 orphanRemovalをtrueに指定して、親コレクション内の子エンティティがnullに設定されている場合に孤立した子を削除することができます。つまり、親コレクションに存在しない場合は子を削除します。 または、子テーブルの外部キー制約をON DELETE CASCADEとして指定します。永続コンテキストをリフレッシュする必要があるため、EntityManager.remove(親)を呼び出した後でEntityManager.clear()を呼び出す必要があります。子エンティティは、データベースで削除された後も永続コンテキストに存在するはずです。

+0

すべてのニュース?あなたの問題を解決しますか? –

関連する問題