簡體   English   中英

如何使用Hibernate正確刪除復雜的對象?

[英]How to properly delete a complex object using Hibernate?

這是問題所在。 當我嘗試從數據庫中刪除目錄對象時,Hibernate還會刪除所有具有關聯的類型和類型ID的目錄對象。 例如,如果我要刪除Type.id = 1和Genre.id = 1的Catalog,則Hibernate刪除帶有此類ID的每個Catalog。 任何想法如何解決? 我只需要刪除一個Catalog對象,而不刪除id = 1的Type和Genre對象。

@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>();

我的刪除目錄對象的方法

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

這是由於Cascade.ALL。 如果刪除父級,則在使用Cascade.ALL時也會刪除所有相關的子級。

而是ALL從下面僅選擇您需要的東西

CascadeType.PERSIST:如果調用persist()或管理實體,則將持久化(創建)操作級聯到關聯的實體

CascadeType.MERGE:如果調用merge()或管理實體,則將合並操作級聯到關聯的實體

CascadeType.REMOVE:如果調用delete(),則將刪除操作級聯到關聯的實體

CascadeType.REFRESH:如果調用refresh(),則將刷新操作級聯到關聯的實體

CascadeType.DETACH:如果調用detach(),則將分離操作級聯到關聯的實體

CascadeType.ALL:以上全部

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM