【问题标题】:Hibernate-JPA deleting in cascade or triggersHibernate-JPA 在级联或触发器中删除
【发布时间】:2014-05-21 19:10:43
【问题描述】:

我正在使用 JPA 和 Hibernate 作为 MySQL DBMS 的提供程序,我说级联删除不适用于我的情况:

    @Entity
    public class Entity_1{

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private int id;
   private String nomAttribute;

   @ManyToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE})
   private java.util.List<Entity_2> et2;

   ...
   }

第二个实体是

  @Entity
  public class Entity_2{
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private int id;
  private String nomAttribute;
    ...
  }

结果是三个表

Entity_1 ,Entity_2,Entity_1_Entity_2

我注意到当我删除 Entity_1 时,Entity_2 也被删除了,因为删除时的级联。

我想要的是,当我删除 Entity_1 时,Entity_1 和 Entity_2 之间的关系只删除了 Entity_2,但我尝试了很多选项,但都是徒劳的

我应该使用什么选项,或者没有选项,我应该使用触发器??

【问题讨论】:

  • 不,您不需要触发器,请查看此链接:stackoverflow.com/questions/9108224/…
  • 他们不是在谈论级联删除,他们在谈论双向关系,如果不是这样,你能具体说明一下plz

标签: java mysql hibernate jpa


【解决方案1】:

这个解决方案怎么样?

类 Entity1:

@Entity
public class Entity1 {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REMOVE }, mappedBy = "entity1")
    private Collection<Entity1Entity2> collection;

    ...
}

类 Entity2:

@Entity
public class Entity2 {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REMOVE }, mappedBy = "entity2")
    private Collection<Entity1Entity2> collection;

    ...
}

类 Entity1Entity2(即连接表):

@Entity
@IdClass(Entity1Entity2Pk.class)
public class Entity1Entity2 {

    @ManyToOne
    @Id
    private Entity1 entity1;

    @ManyToOne
    @Id
    private Entity2 entity2;

    ...    
}

类 Entity1Entity2Pk(Entity1Entity2 需要):

public class Entity1Entity2Pk {

    private int entity1;

    private int entity2;

}

更新:

我添加了mappedBy = "entity1"mappedBy = "entity2"。 这样@oneToMany 关联就不会创建额外的连接表。

【讨论】:

  • 假设这是一个解决方案,要实现这个解决方案,我必须更改我所有的类(我有很多),这将生成大量的类和表,你能给我一些其他的吗有可能的解决方案
  • @user3660257 这不会产生比使用@ManyToMany 更多的表,就像你上面那样。在您的示例中,JPA 创建了一个表来表示@ManyToMany 的链接。在 Basemasta 的示例中,仍然有一个链接表,但他将其作为一个实体进行管理。我总是使用这个策略而不是@ManyToMany。一个关键原因是,大多数时候,记录链接本身都带有附加数据,例如“链接是什么时候建立的?”。在这种情况下,您只需将非关键字段添加到 Entity1Entity2
  • @GlennLane 根据我在 tuto 中看到的内容,我了解到 oneToMany 关联还会生成第三个表以连接两个实体,不是吗? tuto
  • 答案已更新为 @oneToMany 关联中的 mappedBy。所以这些关联不会生成连接表。
猜你喜欢
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2019-02-25
  • 2017-02-24
相关资源
最近更新 更多