我在Appengine + JPA + Jersey方面确实遇到了一些麻烦,我不会使用这种组合,但是我被大学强迫(Project-Deadline 10.01.16 18:00 GMT + 1)
我要删除所有“ Lehrer”,并在删除其“ Schule”时引用“ Schule”。当“ Lehrer”被删除时,“ 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”,则关联的“ Lehrer” Stay,现在具有无效的“ Schule”引用。
将“ Lehrer”的@ManyToOne设置为Cascade.All时,一旦删除“ Lehrer”,关联的“ Schule”将被删除,因此它可以那样工作,反之则不然。
我究竟做错了什么?
谢谢你的帮助
-浮动
更新,当添加带有Lehrer.schule作为其“ Schule”对象的“ Lehrer”时,“ Schule”中的Set为空。
通过手动删除建议的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();
}
最佳答案
可能发生的情况是,删除文档后,在Lehrer表中删除了对Schule的引用,导致Schule列为null
。在Lehrer表中查找要删除的Schule行时,该行不再存在。当删除Schule文档时,您可以执行的操作是删除Lehrer中Schule为null
的所有行。