Maison >Java >javaDidacticiel >Quelle est la méthode de mappage des relations un-à-plusieurs et plusieurs-à-plusieurs dans Java Hibernate

Quelle est la méthode de mappage des relations un-à-plusieurs et plusieurs-à-plusieurs dans Java Hibernate

王林
王林avant
2023-05-27 17:06:181090parcourir

Un-à-plusieurs et plusieurs-à-plusieurs d'Hibernate

Hibernate est un excellent framework ORM qui simplifie l'accès aux données entre les applications Java et les bases de données relationnelles. Dans Hibernate, les modèles de données complexes peuvent être gérés à l'aide de relations un-à-plusieurs et plusieurs-à-plusieurs.

Le un-à-plusieurs d'Hibernate

Dans Hibernate, une classe d'entité correspondant à plusieurs autres classes d'entités est appelée une relation un-à-plusieurs. Par exemple, une commande peut correspondre à plusieurs articles de commande (OrderItem), et un utilisateur (User) peut correspondre à plusieurs commandes (Order). Pour implémenter une relation un-à-plusieurs dans Hibernate, vous devez définir un attribut de collection dans la classe d'entité pour stocker plusieurs objets associés et configurer l'association dans le fichier de mappage.

Configuration un-à-plusieurs d'Hibernate

Dans la classe d'entité, nous devons définir un attribut de collection pour stocker plusieurs objets associés, comme indiqué ci-dessous :

public class Order {
    private Long id;
    private Date orderDate;
    private List<OrderItem> items = new ArrayList<OrderItem>();
    // getters and setters
}

Dans le fichier de mappage, nous devons utiliser c523e60c53861d68a0cf961ec47f5315 pour configurer les attributs et les relations définis, comme indiqué ci-dessous : ace372f96ca3ec664acb3aaa2421b04c标签来配置集合属性和关联关系,如下所示:

<class name="Order" table="orders">
    <id name="id" column="id">
        <generator class="native"/>
    </id>
    <property name="orderDate" column="order_date"/>
    <set name="items" table="order_items" inverse="true" cascade="all">
        <key column="order_id"/>
        <one-to-many class="OrderItem"/>
    </set>
</class>

其中,ace372f96ca3ec664acb3aaa2421b04c标签中的name属性对应实体类中的集合属性名,table属性对应关联表的名称,inverse属性表示是否将关联关系交给集合属性维护,cascade属性表示级联操作,42538adbdb6240b2b083a000a615d5bd标签用于指定关联表中的外键列,f7850c684431509b294b210c6237726e标签用于指定关联实体类。

Hibernate的一对多操作

在Hibernate中,我们可以通过集合属性来访问关联对象。例如,我们可以通过getItems()方法获取一个订单的所有订单项,通过addItem(item)方法向订单中添加一个订单项,如下所示:

Order order = session.get(Order.class, orderId);
List<OrderItem> items = order.getItems();
OrderItem item = new OrderItem();
// set item properties
order.addItem(item);

Hibernate的一对多关系可以解决实际问题中的很多复杂数据模型,比如,在电商网站中,一个订单(Order)可能会包含多个订单项(OrderItem),一个订单项又可能包含多个商品信息(Product)。

Hibernate的多对多

多对多关系在Hibernate中表示多个实体类之间相互关联。比如,一个学生(Student)可以选修多个课程(Course),一个课程(Course)可以被多个学生(Student)选修。要在Hibernate中实现多对多关系,需要在实体类中定义一个集合属性来存储多个关联对象,同时在映射文件中配置关联关系。

Hibernate的多对多配置

在实体类中,我们需要定义一个集合属性来存储多个关联对象,如下所示:

public class Student {
    private Long id;
    private String name;
    private List<Course> courses = new ArrayList<Course>();
    // getters and setters
}

在映射文件中,我们需要使用ace372f96ca3ec664acb3aaa2421b04c标签来配置集合属性和关联关系,如下所示:

<class name="Student" table="students">
    <id name="id" column="id">
        <generator class="native"/>
    </id>
    <property name="name" column="name"/>
    <set name="courses" table="student_courses">
        <key column="student_id"/>
        <many-to-many column="course_id" class="Course"/>
    </set>
</class>

其中,ace372f96ca3ec664acb3aaa2421b04c标签中的name属性对应实体类中的集合属性名,table属性对应关联表的名称,42538adbdb6240b2b083a000a615d5bd标签用于指定关联表中的外键列,f28ba8748e989755003e512f5a4f884c标签用于指定关联实体类。

Hibernate的多对多操作

在Hibernate中,我们可以通过集合属性来访问关联对象。例如,我们可以通过getCourses()方法获取一个学生选修的所有课程,通过addCourse(course)方法向学生中添加一个课程,如下所示:

Student student = session.get(Student.class, studentId);
List<Course> courses = student.getCourses();
Course course = new Course();
// set course properties
student.addCourse(course);

Hibernate的多对多关系可以解决实际问题中的很多复杂数据模型,比如,在学校中,一个学生(Student)可以选修多个课程(Course),一个课程(Course)也可以被多个学生(Student)选修。

Hibernate的级联操作

在Hibernate中,我们可以通过配置级联操作来简化数据库操作。比如,我们可以在映射文件中配置cascade属性来实现级联操作,如下所示:

<set name="items" table="order_items" inverse="true" cascade="all">

其中,cascade属性可以设置为allsave-updatedeletedelete-orphan等值,分别表示所有操作、保存和更新操作、删除操作、删除孤儿操作等。

Hibernate的级联操作可以极大地简化代码量,提高开发效率。

Hibernate的延迟加载

在Hibernate中,我们可以使用延迟加载来提高数据库访问性能。比如,我们可以在映射文件中配置lazy属性来实现延迟加载,如下所示:

<set name="items" table="order_items" inverse="true" cascade="all" lazy="true">

其中,lazy属性可以设置为truefalse

String hql = "from Course as c where c.id in (select sc.course.id from StudentCourse as sc where sc.student.id = :studentId)";
Query query = session.createQuery(hql);
query.setParameter("studentId", studentId);
List<Course> courses = query.list();

Parmi eux, l'attribut name dans la balise ace372f96ca3ec664acb3aaa2421b04c correspond à l'attribut dans la classe d'entité Le nom de l'attribut de collection. L'attribut table correspond au nom de la table d'association. L'attribut inverse indique s'il faut remettre la relation d'association. à l'attribut de collection pour la maintenance. L'attribut cascade indique le niveau. Pour les opérations de jointure, la balise 42538adbdb6240b2b083a000a615d5bd est utilisée pour spécifier la colonne de clé étrangère dans la table associée. , et la balise f7850c684431509b294b210c6237726e est utilisée pour spécifier la classe d'entité associée.

Opération un-à-plusieurs d'Hibernate

Dans Hibernate, nous pouvons accéder aux objets associés via les propriétés de la collection. Par exemple, nous pouvons obtenir tous les éléments de campagne d'une commande via la méthode getItems(), et ajouter un élément de commande à la commande via la méthode addItem(item), comme indiqué ci-dessous :

rrreee

La relation un-à-plusieurs d'Hibernate peut résoudre de nombreux modèles de données complexes dans des problèmes pratiques. Par exemple, dans un site Web de commerce électronique, une commande (Commande) peut contenir plusieurs éléments de commande (OrderItem) et un. L'article de commande peut contenir plusieurs articles de commande. Informations sur le produit (Produit).

La relation plusieurs-à-plusieurs d'Hibernate🎜🎜La relation plusieurs-à-plusieurs représente la corrélation entre plusieurs classes d'entités dans Hibernate. Par exemple, un étudiant peut suivre plusieurs cours et un cours peut être suivi par plusieurs étudiants. Pour implémenter une relation plusieurs-à-plusieurs dans Hibernate, vous devez définir un attribut de collection dans la classe d'entité pour stocker plusieurs objets associés et configurer l'association dans le fichier de mappage. 🎜🎜Configuration plusieurs-à-plusieurs d'Hibernate🎜🎜Dans la classe d'entité, nous devons définir un attribut de collection pour stocker plusieurs objets associés, comme indiqué ci-dessous : 🎜rrreee🎜Dans le fichier de mappage, nous devons utiliser c523e60c53861d68a0cf961ec47f5315 pour configurer les attributs et les relations définis, comme indiqué ci-dessous : 🎜rrreee🎜 Parmi eux, l'attribut name dans la balise ace372f96ca3ec664acb3aaa2421b04c correspond à l'attribut dans la classe d'entité Nom de l'attribut Collection, l'attribut table correspond au nom de la table associée, la balise 42538adbdb6240b2b083a000a615d5bd est utilisée pour spécifier la colonne de clé étrangère dans le table associée, 34b72a72839a86705d47e87c7e702283 est utilisée pour spécifier la classe d'entité associée. 🎜🎜Opération plusieurs-à-plusieurs d'Hibernate🎜🎜Dans Hibernate, nous pouvons accéder aux objets associés via les propriétés de la collection. Par exemple, nous pouvons récupérer tous les cours suivis par un étudiant via la méthode getCourses(), et ajouter un cours à l'étudiant via la méthode addCourse(course), comme illustré ci-dessous : 🎜rrreee 🎜La relation plusieurs-à-plusieurs d'Hibernate peut résoudre de nombreux modèles de données complexes dans des problèmes pratiques. Par exemple, dans une école, un étudiant (Étudiant) peut suivre plusieurs cours (Cours) et un cours (Cours) peut. également être utilisé par plusieurs étudiants (étudiants) au choix. 🎜🎜Opérations en cascade d'Hibernate🎜🎜Dans Hibernate, nous pouvons simplifier les opérations de base de données en configurant les opérations en cascade. Par exemple, nous pouvons configurer l'attribut cascade dans le fichier de mappage pour implémenter des opérations en cascade, comme indiqué ci-dessous : 🎜rrreee🎜Parmi eux, l'attribut cascade peut être défini sur all, save-update, delete, delete-orphan et d'autres valeurs, représentent respectivement toutes les opérations, sauvegarde et mise à jour opérations, opérations de suppression, opérations de suppression orphelines, etc. 🎜🎜Le fonctionnement en cascade d'Hibernate peut grandement simplifier la quantité de code et améliorer l'efficacité du développement. 🎜🎜Chargement paresseux d'Hibernate🎜🎜Dans Hibernate, nous pouvons utiliser le chargement paresseux pour améliorer les performances d'accès à la base de données. Par exemple, nous pouvons configurer l'attribut lazy dans le fichier de mappage pour implémenter le chargement différé, comme indiqué ci-dessous : 🎜rrreee🎜Parmi eux, l'attribut lazy peut être défini sur true code> ou false, indiquant respectivement l'activation du chargement différé et du chargement immédiat. 🎜🎜Le chargement paresseux d'Hibernate peut considérablement améliorer les performances d'accès à la base de données et réduire les opérations de base de données inutiles. 🎜🎜Requête Hibernate🎜🎜Dans Hibernate, nous pouvons utiliser HQL (Hibernate Query Language) pour interroger la base de données. HQL est similaire à SQL, mais il s'agit d'un langage de requête orienté objet qui utilise les concepts d'objets et d'attributs au lieu de tables et de colonnes. 🎜🎜Par exemple, nous pouvons utiliser HQL pour interroger tous les cours suivis par un étudiant, comme indiqué ci-dessous : 🎜
String hql = "from Course as c where c.id in (select sc.course.id from StudentCourse as sc where sc.student.id = :studentId)";
Query query = session.createQuery(hql);
query.setParameter("studentId", studentId);
List<Course> courses = query.list();

Hibernate的查询功能非常强大,可以灵活地满足不同的查询需求。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer