hibernate 注解实现多对多

本文介绍了使用Hibernate注解来实现多对多关系的示例,包括创建学生、课程及选课关系的数据库表,定义对应的Java Bean类,并通过注解配置多对多关系。同时展示了如何在hibernate.cfg.xml中配置数据库连接,以及编写测试用例进行数据的保存和查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据库

学生选择课


CREATETABLE stud(

  id INT PRIMARY KEY,

  NAME VARCHAR(30)

);

CREATETABLE course(

  id INT PRIMARY KEY,

  NAME VARCHAR(30)

);

CREATETABLE sc(

  sid INT,

  cid INT,

  CONSTRAINT PRIMARY KEY(sid,cid),

  CONSTRAINT FOREIGN KEY(sid) REFERENCESstud(id),

  CONSTRAINT FOREIGN KEY(cid) REFERENCEScourse(id)

);

2.注解的bean

2.1.类Stud

package czb.domain;

import java.util.ArrayList;

import java.util.List;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.JoinTable;

import javax.persistence.ManyToMany;

import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import org.hibernate.annotations.CascadeType;

import org.hibernate.annotations.GenericGenerator;

@Entity

@Table(name= "stud")

@GenericGenerator(name = "inc",strategy = "increment")

public class Stud {

    @Id

    @Column

    @GeneratedValue(generator = "inc")

    private Integer id;

    @Column

    private String name;

    @ManyToMany

    @Cascade(value = CascadeType.SAVE_UPDATE)

    // 指定中间表

    @JoinTable(name = "sc", joinColumns = @JoinColumn(name = "sid"),

                            inverseJoinColumns = @JoinColumn(name = "cid"))

    private List<Course> courses=newArrayList<Course>();

    public Integer getId() {

        return id;

    }

    public void setId(Integer id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public List<Course>getCourses() {

        return courses;

    }

    public voidsetCourses(List<Course> courses) {

        this.courses = courses;

    }

    @Override

    public String toString() {

        return "Stud [id="+ id + ", name="+ name+ ", courses=" + courses

                +"]";

    }

}


2.2.类Course

@Entity

@Table(name="course")

@GenericGenerator(name="inc",strategy="increment")

public class Course {

    @Id

    @Column

    @GeneratedValue(generator="inc")

    private Integer id;

    @Column

    private String name;

    @ManyToMany

    //指定中间表

    @JoinTable(name="sc",joinColumns=@JoinColumn(name="cid"),

                inverseJoinColumns=@JoinColumn(name="sid"))

    private List<Stud> studs = newArrayList<Stud>();


3.hibernate.cfg.xml

 

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/HibernateConfiguration DTD 3.0//EN"

                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

 <session-factory >

 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

 <property name="hibernate.connection.password">1234</property>

 <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hibernate?characterEncoding=UTF-8</property>

 <property name="hibernate.connection.username">root</property>

 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

 <!-- 配置C3p0的链接 -->

 <property name="hibernate.c3p0.max_size">3</property>

 <property name="hibernate.c3p0.min_size">1</property>

 <property name="hibernate.c3p0.acquire_increment">2</property>

 <property name="hibernate.c3p0.timeout">3000</property>

 <property name="hibernate.c3p0.idle_test_period">2000</property>

 <property name="hibernate.c3p0.max_statements">50</property>

 <property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>

 <property name="current_session_context_class">thread</property>

 <property name="show_sql">true</property>

 <!-- 配置*.hbm.xml文件 -->

 <!--  <mapping resource="czb/domain/Person.hbm.xml"/>

 <mapping resource="czb/domain/Stud.hbm.xml"/>-->

 <mapping class="czb.domain.Stud"/>

 <mapping class="czb.domain.Course"/>

 </session-factory>

</hibernate-configuration>


4.测试

public classManyToMany {

    @Test

    publicvoidsave(){

      Session s = openSession();

      s.beginTransaction();

      Stud stud = new Stud();

      stud.setName("李四2");

      Course course = new Course();

      course.setName("英语2");

      

      stud.getCourses().add(course);

      s.save(stud);

      

      s.getTransaction().commit();

    }

    @Test

    publicvoidquery(){

     Session s = openSession();

     Query query = s.createQuery("select new map(s.name as sname ,c.name as cname)from Stud s join s.courses c order by s.name");

     List list = query.list();

     System.err.println(list);

    }

}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值