0

这是问题所在。当我尝试从数据库中删除目录对象时,Hibernate 还会删除所有具有关联类型和流派 ID 的目录对象。例如,如果我要删除 Type.id=1 和 Genre.id=1 的目录,那么 Hibernate 会删除每个具有此类 ID 的目录。任何想法如何解决它?我只需要删除一个 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();
}
4

1 回答 1

1

这是因为 Cascade.ALL。如果您使用 Cascade.ALL,如果您删除一个父级,也会删除所有相关的子级。

相反,ALL 从下面只选择你需要的

CascadeType.PERSIST:如果调用了 persist() 或管理了实体,则将持久(创建)操作级联到关联实体

CascadeType.MERGE:如果调用了 merge() 或管理实体,则将合并操作级联到关联实体

CascadeType.REMOVE:如果 delete() 被调用,则将删除操作级联到关联实体

CascadeType.REFRESH:如果调用 refresh(),则将刷新操作级联到关联实体

CascadeType.DETACH:如果调用了 detach(),则将分离操作级联到关联实体

CascadeType.ALL:以上所有

于 2014-03-09T22:24:14.153 回答