У меня есть некоторые проблемы с Appengine + JPA + Jersey, я не использую эту комбинацию, но меня принуждает университет (Project-Deadline 10.01.16 18:00 GMT + 1)GAE JPA @OneToMany orphanRemoval + Каскад работает не так, как ожидалось
Я хочу удалить все «Lehrer» с refferences в «Schule», когда их «Schule» удаляется. Когда «Лерер» получает Удаленный «Шуле», он должен оставаться нетронутым. Вот мои классы:
@Entity
@XmlAccessorType(XmlAccessType.NONE)
public class Lehrer {
@Id
@XmlElement
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
@XmlElement
private String vorname;
@XmlElement
private String nachname;
@Transient
@XmlElement
private String passwort;
private String hash;
private String salt;
@XmlElement
@Unowned
@ManyToOne(optional = false)
private Schule schule;
..getter&setters..
}
@Entity
@XmlAccessorType(XmlAccessType.NONE)
public class Schule {
@Id
@XmlElement
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
@XmlElement
private String name;
@OneToMany(cascade = CascadeType.ALL,mappedBy = "schule", orphanRemoval = true)
private Set<Lehrer> Lehrerliste;
@OneToMany(cascade = CascadeType.ALL,mappedBy = "schule", orphanRemoval = true)
private Set<Klasse> Klassenliste;
...getter&setter...
}
И код для удаления "Schule".
@DELETE
@Path("/id/{id}")
public Response deleteSchule(@PathParam("id") long id) {
EntityManager em = EMF.get();
Schule GesuchterSchule = em.find(Schule.class, KeyFactory.createKey("Schule", id));
if (GesuchterSchule != null) {
System.out.println("remove " + GesuchterSchule + "\n");
em.remove(GesuchterSchule);
em.close();
return Response.status(Status.NO_CONTENT).build();
}
em.close();
System.out.println("remove faild for id: " + id + "\n");
return Response.status(Status.NOT_FOUND).build();
}
Теперь моя проблема в том, что когда-то удаление «Schule» связанный «Лерер» Stay и теперь имеют недопустимый «Schule» ссылка.
При настройке @ManyToOne «Lehrer» на Cascade. Все ассоциированные «Schule» получают Удаленный после удаления «Lehrer», поэтому он работает именно так, но не наоборот.
Что я делаю неправильно?
Спасибо за любую помощь - Flo
Update, кажется, при добавлении "Лерер" с Lehrer.schule как его объект "Schule", набор в "Schule" является недействительным.
Обход проблемы вручную путем удаления таких предметов, как goofiw.
@DELETE
@Path("/id/{id}")
@SuppressWarnings("unchecked")
public Response deleteSchule(@PathParam("id") long id) {
EntityManager em = EMF.get();
Schule GesuchterSchule = em.find(Schule.class, KeyFactory.createKey("Schule", id));
Query query = em.createQuery("SELECT e FROM Lehrer e WHERE e.schule = :s");
query.setParameter("s", GesuchterSchule);
List<Lehrer> list = (List<Lehrer>) query.getResultList();
em.getTransaction().begin();
for (Lehrer lehrer : list) {
em.remove(lehrer);
}
em.getTransaction().commit();
if (GesuchterSchule != null) {
System.out.println("remove " + GesuchterSchule + "\n");
em.getTransaction().begin();
em.remove(GesuchterSchule);
em.getTransaction().commit();
em.close();
return Response.status(Status.NO_CONTENT).build();
}
em.close();
System.out.println("remove faild for id: " + id + "\n");
return Response.status(Status.NOT_FOUND).build();
}
, где зимует в это? какой datastore вы используете? –
sry я связал это неправильно, используя «datanucleus jpa v2» –