0

これが問題です。データベースから Catalog オブジェクトを削除しようとすると、Hibernate は関連する Type および Genre Id を持つすべての Catalog オブジェクトも削除します。たとえば、Type.id=1 および Genre.id=1 のカタログを削除する場合、Hibernate はそのような ID を持つすべてのカタログを削除します。それを修正する方法はありますか?id=1 の Type オブジェクトと Genre オブジェクトを削除せずに、Catalog オブジェクトを 1 つだけ削除する必要があります。

@Entity
@Table(name = "catalog", catalog = "media_store_db")
public class Catalog implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "product_name", length = 100)
    private String productName;

    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "genre_id", referencedColumnName = "genre_id")
    private Genre genre;

    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "type_id", referencedColumnName = "type_id")
    private Type type;


@Entity
@Table(name = "genres", catalog = "media_store_db")
public class Genre implements Serializable {

    @Id
    @Column(name = "genre_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "genre_name")
    private String name;

    @OneToMany(mappedBy = "genre", cascade = CascadeType.ALL)
    Collection<Catalog> catalogs = new ArrayList<Catalog>();

@Entity
@Table(name = "types", catalog = "media_store_db")
public class Type implements Serializable {

    @Id
    @Column(name = "type_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "type_name")
    private String name;

    @OneToMany(mappedBy = "type", cascade = CascadeType.ALL)
    Collection<Catalog> catalogs = new ArrayList<Catalog>();

Catalog オブジェクトを削除する私のメソッド

public void deleteCatalog(Integer catalogId) {
        Session session = config.getSession();
        Transaction tx = session.beginTransaction();
        session.delete(session.get(Catalog.class, catalogId));
        tx.commit();
        session.close();
}
4

1 に答える 1

1

これは、Cascade.ALL が原因です。Cascade.ALL を使用している場合、親を削除すると、関連するすべての子も削除されます。

代わりに、すべて以下から必要なものだけを選択してください

CascadeType.PERSIST: persist() が呼び出された場合、またはエンティティが管理されている場合、関連付けられたエンティティに永続化 (作成) 操作をカスケードします。

CascadeType.MERGE: merge() が呼び出された場合、またはエンティティが管理されている場合、関連付けられたエンティティにマージ操作をカスケードします

CascadeType.REMOVE: delete() が呼び出された場合、関連付けられたエンティティに削除操作をカスケードします

CascadeType.REFRESH: refresh() が呼び出された場合、関連付けられたエンティティに更新操作をカスケードします。

CascadeType.DETACH: detach() が呼び出された場合、デタッチ操作を関連付けられたエンティティにカスケードします

CascadeType.ALL: 上記のすべて

于 2014-03-09T22:24:14.153 に答える