我对JPA / Hibernate和Java都很陌生,并且在使用EntityManager类管理持久对象的基础上遇到了一些麻烦。如果有人能向我解释一些非常基本的东西,我会非常感激,因为我无法从文档中找到它。
JSE环境中的JPA 2 / Hibernate / Postgresql。
*以下类定义*
以下工作正如我所期望的那样:
em.getTransaction().begin();
Car corolla = new Car();
Part clutch = new Part();
clutch.setCar( corolla );
Part bumper = new Part();
bumper.setCar( corolla );
em.persist( corolla );
em.persist( clutch );
em.persist( bumper );
em.getTransAction().commit();
但这并没有删除数据库中部件与汽车的链接:
tx.begin();
corolla.getParts().clear();
tx.commit();
为什么会这样?
提前致谢,对不起,如果这是一个愚蠢的问题。
麦克
汽车类:
@Entity
public class Car {
private Long id;
private Set<Part> parts;
....
public Car() { parts = new HashSet<Part>(); }
@Id
@GeneratedValue( generator="increment" )
@GenericGenerator( name="increment", strategy = "increment" )
public Long getId() { return id; }
private void setId( Long id ) { this.id = id; }
@OneToMany( mappedBy="car", cascade=CascadeType.ALL )
public Set<Part> getParts() { return this.parts; }
public void setParts( Set<Part> parts ) { this.parts = parts; }
....
}
Part class:
@Entity
public class Part {
private Long id;
private Car car;
...
public Part() {};
@Id
@GeneratedValue( generator="increment" )
@GenericGenerator( name="increment", strategy = "increment" )
public Long getId() { return id; }
private void setId( Long id ) { this.id = id; }
@ManyToOne
@JoinColumn( name="car_id" )
public Car getCar() { return this.car; }
public void setCar( Car car ) { this.car = car; }
...
}
答案 0 :(得分:3)
当双向关系的各方不一致时,拥有方的状态(即没有mappedBy
的一方)被持久化到数据库。所以,你需要立即修改双方:
for (Part p: corolla.getParts()) {
p.setCar(null);
}
corolla.getParts().clear();
答案 1 :(得分:0)
看起来很好,但是从数据库中删除实体时,您应该使用:
EntityManager.remove