2016-01-09 2 views
0

У меня есть некоторые проблемы с 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(); 
} 
+0

, где зимует в это? какой datastore вы используете? –

+0

sry я связал это неправильно, используя «datanucleus jpa v2» –

ответ

1

Что может быть происходит, ссылка на Schule удаляется в таблице Лерер, когда документ будет удален, в результате чего null для столбца Schule. Когда вы смотрите в таблице Lehrer для удаления строки Schule, она больше не существует. Что бы вы могли сделать, удалите любые строки с помощью Schule из null в Lehrer, когда вы удалите документ Schule.

+0

Благодарю вас за ваши усилия, я решил это так, но я не знаю, следует ли отмечать это как ответ, поскольку это больше похоже на обходной путь: S –

Смежные вопросы