JPA cascade persist - plusieurs vers un
J'ai beaucoup d'une relation et je suis en train d'essayer de conserver une entité enfant.
public class Office
{
public int id;
public int grades;
@OneToMany
public set<Employee> employees;
}
public class Employee{
@GeneratedValue(strategy=GeneratedValue.identity)
public int empid;
@ManyToOne(cascade=cascadeType.ALL)
public Office office;
}
Bureau de l'Id est déjà présent dans la base de données. Mais l'employé n'est pas.
Maintenant, si je suis ajout d'un employé et ses notes doit aller dans la base de données de bureau.
Quand je fais la suite de l'opération,les notes ne sont pas sauvés
Office office = new Office();
office.setId(23);
office.setGrades(5);
employee.setOffice(office);
em.persist(employee);
Comment enregistrer des notes dans la table de bureau en une seule opération
OriginalL'auteur Vignesh | 2011-08-13
Vous devez vous connecter pour publier un commentaire.
D'abord, fixez votre cartographie.
L'association est bidirectionnelle, et l'un des côtés (un côté) doit être marquée comme l'inverse de l'autre à l'aide de l'attribut mappedBy:
Les employés est un seul des employés de l'office. Voulez-vous vraiment supprimer l'ensemble du bureau lorsque vous supprimez un seul employé? Si non, pourquoi avez-vous mis un
cascade=cascadeType.ALL
sur le@ManyToOne
? Ces annotations ont des conséquences. Ne pas les utiliser sans les comprendre.Maintenant, pour vraiment répondre à la question. Si le poste existe déjà dans la base de données, vous ne devez pas vous en construire une nouvelle. Aller le chercher à partir de la base de données et mise à jour:
Maintenant, vous pouvez également joindre le bureau pour le nouvel employé. Mais comme c'est une relation bidirectionnelle, vous devez également initialiser l'autre côté de l'association, afin de conserver l'objet graphique cohérente:
La cascade est utilisé pour cascade d'opérations. Si vous avez une cascade de type persistent sur une.b, et que vous appelez persistent sur une, persistent sera automatiquement appelé b ainsi. Dans le ci-dessus, vous n'appelez pas n'importe quelle opération sur le bureau, donc il n'y a rien à en cascade.
D'accord, je vois maintenant. À propos de la "mappedBy": elle est facultative. Si vous l'utilisez, hibernate utilisera une colonne pour la cartographie, si on les laisse sortir, il va utiliser une table supplémentaire. La table est une sorte de matraquage, mais je n'aimais pas les dépendances circulaires. Je pense qu'ils pourraient présenter des fuites de mémoire.
mappedBy n'est pas une option dans une association bidirectionnelle. Si vous ne l'utilisez pas, vous disposez de deux, les indépendants, les associations unidirectionnelles.
En fait, dans mon cas, je pense qu'il est juste unidirectionnel.
OriginalL'auteur JB Nizet