您的位置:首页 > 其它

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

2017-11-21 14:14 387 查看
场景:多个学生对应一个班级(典型的多对一关系)

创建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>


单元测试方法
@Test
public 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的对象

@Test
public 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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息