在ManyToOne关系中删除JPA / Hibernate级联删除

时间:2014-02-22 18:49:18

标签: java spring hibernate jpa

我在使用@ManyToOne进行级联重播方面存在很大问题。我有两个类:User(来自“one”方)和Adress(来自“many”方),我的问题是:

- 当删除与User关联的Adress实体时(当然用户有很多关联的Adress),不仅会从数据库中删除一个Adress记录,而且他的所有者= User ass。更多 - 与此用户相关的所有地址也将被删除:(

- 所以,这不是我的预期,任何人都可以告诉我,我该怎么办?

用户类

public class User implements Serializable{

    @Column(name="id")
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

private Set<Adress> adresses;   

     @OneToMany(mappedBy = "user", cascade=CascadeType.ALL)
     public Set<Adress> getAdresses() {
         return adresses;
     }
     ...
}

单元类

@Entity
@Table(name="unit")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="unit_type", discriminatorType = DiscriminatorType.STRING)
public class Unit implements Serializable {

    private Integer id;

    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

}

地址类

@DiscriminatorValue("adr")
public class Adress extends Unit implements Serializable {

     private User user;

     @ManyToOne 
     @JoinColumn(name="adress_id")
     public User getUser(){
         return user;
     }
     ...

}

AdressDaoImpl类的一部分:

    public void delete(Adress adress) {
        Adress mergedWithContextAdress = entityManager.merge(adress);
        entityManager.remove(mergedWithContextAdress);
        logger.info("Adress removed.");
    }

AdressDaoTest课程的部分:

    Adress adress = adressDao.findById(1);
    adressDao.delete(adress);

1 个答案:

答案 0 :(得分:0)

尝试这样做

  Adress adress = adressDao.findById(1);
  adress.setUser(null);   //Set null reference before remove
  adressDao.delete(adress);

只是评论它应该是地址而不是地址XD。

相关问题