1. Comment configurer la relation plusieurs-à-plusieurs
有三张表 role、permission,分别是角色与权限表,二者是多对多关系,对应关系的中间表为p_role_permission,中间表中r_sysId对应role表中的主键sysId、中间表中p_sysId列对应permission表中的主键sysId(说白了就是中间表中两列是外键列分别指向role和permission表)。下面代码是role表对应的注解配置实体类
@Entity
@Table(name="role",catalog="byky")
pubic class Role{
......
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="p_role_permission",joinColumns= {@JoinColumn(name="r_sysId",referencedColumnName = "sysId")},inverseJoinColumns={@JoinColumn(name="p_sysId",referencedColumnName = "sysId")})
public Set<Permission> getPermissions() {
return permissions;
}
......
}
- La valeur d'extraction dans l'annotation @ManyToMany peut être configurée avec deux options: fetch = FetchType.LAZY signifie chargement paresseux, à l'aide de la technologie proxy, lorsque l'objet de rôle est chargé, l'attribut permissions de l'objet de rôle ne sera pas chargé temporairement, lorsque le getPermissions () du rôle est appelé, hibernate le prendra. Interrogez la base de données pour charger les données. Un point doit être particulièrement souligné. Le chargement différé nécessite que la session de mise en veille prolongée soit ouverte. La session associée à l'objet de rôle actuel est fermée. Lors de l'appel de la propriété permissions de l'objet de rôle, une erreur com.sun.jdi.InvocationException sera être signalé. Veillez donc à ne pas obtenir la valeur de l'attribut de chargement différé après la fermeture de la session. Il est courant de l'appeler dans Contreller, sauf si vous utilisez des éléments déclaratifs pour retarder la fermeture de la méthode getCurrentSession.
- @ManyToMany annotation dans la configuration de la valeur d'extraction fetch = FetchType.EAGER signifie charger immédiatement, il ne pourra pas lire les données lorsque la session est fermée, mais entraînera une redondance des requêtes de données, les attributs inutiles sont lus en une seule fois, provoquant pression sur la base de données.
- Le nom = "p_role_permission" dans @JoinTable configure le nom de la table intermédiaire, joinColumns = {@JoinColumn (name = "r_sysId", referencedColumnName = "sysId")} dans @JoinColumn (name = "r_sysId" configure la correspondance de classe actuelle Le champ de clé étrangère de la table dans la table intermédiaire, referencedColumnName = "sysId" configure le champ de clé primaire correspondant à la clé étrangère de la table intermédiaire dans la classe actuelle;
inverseJoinColumns = {@ JoinColumn (name = "p_sysId", referencedColumnName = "sysId")} Oui Se réfère à une autre permission de table correspondant à la classe courante plusieurs-à-plusieurs, le premier @JoinColumn (name = "p_sysId" est également le champ de clé étrangère correspondant à la table des permissions de la table intermédiaire, referencedColumnName = "sysId") uniquement l'autorisation et la table intermédiaire Le champ de clé primaire sysId correspondant au champ de clé étrangère p_sysId. - Le fonctionnement en cascade en cascade est plus important, mettez un titre séparé pour expliquer.
2. Fonctionnement en cascade
Le fonctionnement en cascade d'Hibernate est destiné aux objets et aux objets. Cela peut être vu à partir des éléments configurables de cascade. Ne le confondez pas avec l'opération en cascade dans la base de données lorsque vous l'examinez.
Deux configurations en cascade:
Configurez sur les annotations de @OneToOne, @OneToMany, @ManyToOne, @ManyToMany, en utilisant javax.persistence.CascadeType, qui est la configuration JPA
@ManyToMany(fetch=FetchType.LAZY,casecade={CasecadeType.DETACH,CascadeType.MERGE})
Le contenu de casecade est un tableau de CasecadeType. Plusieurs contenus peuvent être configurés, s'il n'y a qu'un seul élément de configuration, il peut être directement écrit comme casecade = CasecadeType.DETACH, le formulaire dans le code est comme ceci
@ManyToMany(fetch=FetchType.LAZY,casecade=CascadeType.MERGE)
Une autre méthode de configuration consiste à utiliser org.hibernate.annotations.CascadeType, c'est-à-dire que le formulaire de configuration d'annotation d'hibernation est le suivant
@ManyToMany(fetch=FetchType.LAZY)
@Cascade(value={ org.hibernate.annotations.CascadeType.DETACH})
@JoinTable(name="p_role_permission",joinColumns={@JoinColumn(name="r_sysId",referencedColumnName = "sysId")},inverseJoinColumns={@JoinColumn(name="p_sysId",referencedColumnName = "sysId")})
public Set<PPermission> getPermissions() {
return permissions;
}
On peut voir que l'annotation @Casecade est utilisée, où la valeur de la valeur est un tableau de type org.hibernate.annotations.CascadeType, qui peut être configuré avec plusieurs valeurs ou définir une valeur.
Fonction Casecade: s'il faut mettre en cascade les objets dans le champ annoté. Valeurs facultatives lors de l'utilisation des paramètres JPA : javax.persistence.CascadeType.PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL. Vous pouvez en sélectionner un ou plusieurs. Lorsque vous en choisissez un, les accolades peuvent être utilisées ou non
Valeur facultative | La description |
---|---|
PERSISTER | Opération persistante de la session en cascade. En supposant que l'annotation @ManyToMany de la classe Student et du champ teacher est configurée avec cascade = {CascadeType.PERSIST}, alors, lorsque l'objet stu1 définit une collection professor (les objets de cette collection sont transitoires), lorsque l'objet stu1d est persistant, tous les objets transitoires de cette collection seront mis en cascade et persistants dans la base de données. |
FUSIONNER | Opération de fusion en cascade. Comme ci-dessus |
RAFRAÎCHIR | Opération de rafraîchissement en cascade. Comme ci-dessus |
RETIRER | Opération de suppression en cascade. Comme ci-dessus |
DÉTACHER | Opération d'expulsion en cascade. Comme ci-dessus |
TOUT | Cascade de toutes les opérations ci-dessus |
Les cinq premières valeurs de sélection ci-dessus sont respectivement associées à la méthode dans la session, et seule la méthode correspondante peut déclencher |
Si vous utilisez le CascadeType annoté par Hibernate lui-même, les valeurs facultatives sont les suivantes:
Valeur facultative | La description |
---|---|
EFFACER | La méthode de suppression en session en cascade |
DELETE_ORPHAN | Obsolète et déconseillé |
DÉTACHER | Équivalent au CascadeType.DETACH de JPA |
EXPULSER | Obsolète, veuillez utiliser l'ancien DETACH |
FUSIONNER | Équivalent à CascadeType.MERGE |
PERSISTER | Équivalent à CascadeType.PERSIST |
RAFRAÎCHIR | Équivalent à CascadeType.REFRESH |
RETIRER | Équivalent à CascadeType.REMOVE. |
REPRODUIRE | Méthode REPLICATE dans une session en cascade |
SAVE_UPDATE | Trois méthodes de cascade session.save () ou session.update () ou session.saveOrUpdate () |
TOUT | Cascade de toutes les opérations ci-dessus |
Notez qu'une mauvaise utilisation du fonctionnement en cascade affectera les performances