2014-07-11 4 views
0

J'ai trois tables l'une pour contenir l'information de l'élève, la seconde qui contient l'information sur la classe. Troisièmement, il faut associer la table des élèves et studentclass classeJPA: cascade dans une relation d'association de table

Les entités et les relations sont donnés ci-dessous

class Student 
{ 
@Id 
@Column(name="STUDENT_ID") 
long studentId; 
@OneToMany(cascade=CascadeType.ALL,mappedBy="student") 
Set<StudentClass> studentClasses 
} 

class Class 
{ 
@Id 
@Column(name="CLASS_ID") 
long classId; 

@OneToMany(cascade=CascadeType.ALL,mappedBy="class") 
Set<StudentClass> studentClasses 
}  

class StudentClass 
{ 
@Id 
@Column(name="STUDENT_CLASS_ID") 
long studentClassid; 

@ManyToOne 
@JoinColumn(name="STUDENT_ID") 
private Student student; 

@ManyToOne(cascade=CascadeType.ALL) 
@JoinColumn(name="CLASS_ID") 
private Class class; 
} 

class persist{ 
public void persist(){ 
Student student1 = new Student(); 
Class class1 = new Class(); 

session.save(class1);  

StudentClass studentClass = new StudentClass(); 
studentClass.setClass(class1); 
studentClass.setStudent(student1); 
student1.getStudentClasses().add(studentClass); 
session.save(student1);  
session.getTransaction().commit(); 
} 
} 

La logique de persistance ci-dessus fonctionne bien comme je sauverai Class1 séparément et enfin la classe des étudiants. Mais si j'essaie de sauver l'élève1 seul, la classe 1 ne sera pas sauvée? Si la réponse est la classe et les étudiants ne sont pas directement liés, alors comment récupérer récupère toutes les classes quand j'essaie d'aller chercher un étudiant

Répondre

0

D'abord, je pense que vous avez besoin d'avoir vos classes Entités annotées avec @Entity. Avec votre entité StudentClass n'a aucun attribut pour justifier que vous avez codé alors, ne mappez que vos entités Étudiant et Class avec @ManyToMany comme ceci: http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany Si vous avez besoin de récupération obtient toutes les classes quand chercher un étudiant définir l'attribut à la FetchType à FetchType.EAGER ont besoin de plus en Difference between FetchType LAZY and EAGER in Java Persistence API?

0

La cartographie en cascade que vous avez utilisé travaillera très bien avec les opérations JPA EntityManager persist() ou merge(). Cependant, il semble que vous utilisiez la session Hibernate pour enregistrer des objets. Avec cette approche, vous devez également ajouter une annotation spécifique à Hibernate pour le champ class.

0

Vous n'avez pas besoin de créer une entité distincte appelée StudentClass. Vous pouvez utiliser @JoinTable pour le laisser créer pour vous. Cela gérera votre cas de ne pas mettre à jour les valeurs par lui-même.

Effacez la classe et ajoutez

@OneToMany(mappedBy = "Student") 
@JoinTable(name = "StudentClass", joinColumns = @JoinColumn(name = "StudentId"), 
    inverseJoinColumns = @JoinColumn(name = "ClassId")) 
private Collection<Class> classes; 
} 

De plus, autre moyen serait de mettre à jour la table des élèves d'inclure les informations de classe afin que les tables ressemblent - 1. Tableau - Étudiant (StudentID, StudentName , ClassId) 2. Tableau - classe (ClassId, ClassName)

PS - Je suggère également renommer la classe avec cours :)