2011-06-27 2 views
0

Je suis assez nouveau à JPA/Hibernate et à Java, et j'ai quelques problèmes avec les bases de l'utilisation de la classe EntityManager pour gérer les objets persistants. J'apprécierais beaucoup que quelqu'un m'explique quelque chose de très fondamental, parce que je ne peux pas le comprendre à partir de la documentation.JPA EntityManager question

JPA 2/Hibernate/Postgresql dans un environnement JSE.

* Les définitions de classe ci-dessous *

Les travaux suivants que je l'attendre à:

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

Mais cela ne supprime pas les liens des pièces aux voitures dans la base de données:

tx.begin(); 
corolla.getParts().clear(); 
tx.commit(); 

Pourquoi est-ce le cas?

Merci d'avance, et désolé si c'est une question idiote.

Mike.

classe Voiture:

@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; } 

.... 

} 

classe partie:

@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

La réponse de axtavt (ci-dessous), plus le bit sur l'intégration de la relation dans la conception de l'objet dans la réponse de duffymo à ce poste http://stackoverflow.com/questions/949427/is-it-need-to-call-a-flush-jpa-interface-dans-cette-situation m'a aidé à résoudre ce problème. – mdtsandman

Répondre

3

Lorsque les côtés de la relation bidirectionnelle en désaccord, un état du côté propriétaire (c'est-à-dire un côté sans mappedBy) est persisté dans la base de données. Donc, vous devez modifier les deux côtés consitently:

for (Part p: corolla.getParts()) { 
    p.setCar(null); 
} 
corolla.getParts().clear(); 
+0

Le peu sur le côté propriétaire étant persisté est ce dont j'avais besoin. Merci beaucoup pour ça! – mdtsandman

0

Il semble bien, cependant, tout en éliminant une entité à partir de votre base de données, vous devriez utiliser:

EntityManager.remove 
+0

Je ne pense pas que ce soit ce que je cherchais: je ne veux pas enlever les pièces de la DB, mais plutôt supprimer leur association avec la voiture en particulier. Merci, cependant :) – mdtsandman