JPA EntityManager вопрос - PullRequest
       30

JPA EntityManager вопрос

0 голосов
/ 27 июня 2011

Я довольно новичок как в JPA / Hibernate, так и в Java, и у меня возникли некоторые проблемы с основами использования класса EntityManager для управления постоянными объектами. Я был бы очень признателен, если бы кто-то объяснил мне что-то очень простое, потому что я не могу понять это из документации.

JPA 2 / Hibernate / Postgresql в среде JSE.

* Определения классов ниже *

Следующие работы работают так, как я ожидал:

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

Почему это так?

Заранее спасибо, и извините, если это глупый вопрос.

Mike.

Класс автомобиля:

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

....

}

Класс детали:

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

...

}

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Когда стороны двунаправленной связи расходятся, в базе данных сохраняется состояние владеющей стороны (то есть стороны без mappedBy). Итак, вам нужно изменить обе стороны:

for (Part p: corolla.getParts()) {
    p.setCar(null);
}
corolla.getParts().clear();
0 голосов
/ 27 июня 2011

Выглядит нормально, однако при удалении сущности из вашей базы данных вы должны использовать:

EntityManager.remove
...