hibernate多对一单向外键关联——注解实现

来源:互联网 发布:高仿京东商城源码 编辑:程序博客网 时间:2024/06/06 15:45

场景:多个学生对应一个班级(典型的多对一关系)

创建Student 实体类

package com.sosoyo.mtofk;import java.sql.Blob;import java.util.Date;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.OneToOne;import com.sosoyo.dfk.IdCard;/** * @author 24315 学生类 */@Entity //实体类必须的注解,对应一个学生表public class Student {@Id@GeneratedValue(strategy=GenerationType.AUTO)//使用数据库的自动增长主键策略,前提是类型是整形private int sid; private String sname;private String gender;private Date birthday; private String major;@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)//多个学生对应一个班级,cascade规定了级联操作,ALL包括添加、修改、删除操作@JoinColumn(name="cid",referencedColumnName="CID")//name是映射到数据库的名称,referencedColumnName指向被控类中主键属性的名称private ClassRoom classRoom;public Student() {}public Student( String sname,String gender, Date birthday,String major ) { this.sname = sname;this.gender = gender;this.birthday = birthday;this.major = major;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public ClassRoom getClassRoom() {return classRoom;}public void setClassRoom(ClassRoom classRoom) {this.classRoom = classRoom;}}
创建班级实体类

package com.sosoyo.mtofk;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import org.hibernate.annotations.GenericGenerator;@Entity public class ClassRoom {@Id@GeneratedValue(generator="cid")//字符串无法使用自增长主键策略。需要自定义主键生成器,generator指向一个生成器名称@GenericGenerator(name="cid",strategy="assigned")//创建生成器,name为生成器名称,strategy="assigned" 规定生成策略是手动赋值@Column(length=4) //字符串作为主键限制其长度private String cid;private String cname;public ClassRoom() { }public ClassRoom(String cid, String cname) { this.cid = cid;this.cname = cname;}public String getCid() {return cid;}public void setCid(String cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}}
配置cfg.xml文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>    <property name="connection.username">root</property>    <property name="connection.password">120574</property>    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>    <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</property>    <!-- 指定方言 ,方言不同语法格式不同-->    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>    <property name="show_sql">true</property>    <property name="format_sql">true</property>    <!-- 生成策略 -->    <property name="hbm2ddl.auto">create</property>    <!-- 目的在于可以让我们在某一个上下文环境(比如说当前线程)中可以通过SessionFactory.getCurrentSession()得到同一个session会话. -->    <property name="hibernate.current_session_context_class">thread</property>            <mapping class="com.sosoyo.mtofk.Student"/>    <mapping class="com.sosoyo.mtofk.ClassRoom"/>    </session-factory>    </hibernate-configuration>

单元测试方法

@Testpublic void testScehmExport(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);/*Session session = sessionFactory.openSession();Session session = sessionFactory.getCurrentSession();*/SchemaExport schemaExport = new SchemaExport(configuration);schemaExport.create(true, true);}

此时就会自动生成两个新表,student的外键为cid,classroom主键为cid

classroom表

student表


student表的外键


注意:插入数据时候要先保存classroom的对象然后在插入student的对象

@Testpublic void testAddStudents(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);/*Session session = sessionFactory.openSession();*/Session session = sessionFactory.getCurrentSession();Transaction tx = session.getTransaction();tx.begin(); /*SchemaExport schemaExport = new SchemaExport(configuration);schemaExport.create(true, true);*/ClassRoom c1 = new ClassRoom("c001","软件工程");ClassRoom c2 = new ClassRoom("c002","网络工程");//创建四个学生Student s1 = new Student("张三","男",new Date(),"java");Student s2 = new Student("李四","男",new Date(),"java");Student s3 = new Student("王五","女",new Date(),"java");Student s4 = new Student("赵六","女",new Date(),"java");s1.setClassRoom(c1);s2.setClassRoom(c1);s3.setClassRoom(c2);s4.setClassRoom(c2);session.save(c1);session.save(c2);session.save(s1);session.save(s2);session.save(s3);session.save(s4); tx.commit();}






阅读全文
0 0