2010-12-06 5 views
0

J'ai une entité qui a une référence à un autre comme ceux-ci:Comment mettre à jour automatiquement une entité lorsqu'une entité est conservée ou mis à jour

class School { 
    private boolean used = false; 
} 

class Student { 
    @ManyToOne 
    private School school; 
} 

L'attribut used indique que l'entité School est si utilisé, référencé ou pas. Ainsi, une fois créée, une entité School doit avoir la valeur used, mais une fois qu'un Student fait référence à celle-ci, le used doit être défini sur true. Y at-il un moyen automatique de faire cela comme des déclencheurs dans la base de données?

J'essaie d'utiliser @PrePersist et @PostPersist sur l 'entité Student comme cela, mais il ne fonctionne pas:

@PrePersist 
public void prePersist(){ 
    school.setUsed(true); 
} 

Merci,

Répondre

2

Ma pensée est que l'école devrait également avoir une liste inverse des étudiants. c'est-à-dire

class School { 
    private List<Student> students; 
} 

Ainsi, lorsque l'école est chargée, vous pouvez facilement accéder à la liste des étudiants. Ensuite, découvrir si une école est utilisée devient très simple. Vous n'aurez plus besoin d'un drapeau booléen, juste ceci:

public boolean hasStudents() { 
    return students.size() > 0; 
} 
+0

C'est la solution la plus simple et la plus intelligente pour mon cas, merci mon frère! –

0

De plus, vous devez définir les CascadeTypes. Voir l'exemple ci-dessous:

class Team { 
    @OneToMany(mappedBy="team", cascade = CascadeType.ALL) 
    Set players; 
} 
class Player { 
    @ManyToOne 
    Team team; 
} 
+0

Merci pour le rappel, mais ce n'est pas le point ici bro. C'est uniquement lorsque vous persistez/mettez à jour/supprimez un joueur, il persiste/met à jour/supprime également l'équipe. –

1

Une façon est d'écrire un déclencheur sur l'insertion, la mise à jour du tableau étudiant, qui va vérifier si quelqu'un tient la référence clé étrangère à l'école et vous devrez vérifier tous écoles ici. Mappez également votre variable utilisée à une colonne dans la table School. Si un étudiant détient une référence, rendez la colonne vraie et appelez une actualisation de votre couche d'application. À la deuxième réflexion, vérifiez si cela est possible. Quand vous avez besoin de la logique pour la variable utilisée, voyez que si vous pouvez écrire un HQL et utiliser cette HQL, vérifiez si cette école particulière est actuellement utilisée par n'importe quel étudiant. Je pense que c'est une approche plus propre, mais finalement c'est un appel basé sur les exigences :)

Questions connexes