Mise en veille prolongée de la configuration des relations plusieurs-à-plusieurs et des essais de chargement différé

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

Je suppose que tu aimes

Origine blog.csdn.net/u011930054/article/details/87690287
conseillé
Classement