本教程每节课都附带源码,强烈大家建议配合源码学习。
本节源码:http://download.youkuaiyun.com/detail/e421083458/5253705
关系映射(重要)
对象这里的关系映射指的是对象之间的关系,并不是指数据库的关系,本章解决的问题是当对象之间处于
下列关系之一时,数据库表该如何映射,编程上该如何对待。
其实将问题简化就是:怎么写Annotation及增删改査CRUD怎么写
下面我们首先讲关系映射的一对一单向外键关联
Annotation: 在被约束表字段的get方法上加@0ne20ne @JoinColumn
@OneToOne
@JoinColumn(name="wifeid") //指定生成的数据库字段名
public Wife getWife() {
return wife;
}
xml: 在被约束表的xml配置文件中加<many-to-one unique
<class name="com.bjsxt.pojo.StuIdCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="num"/>
<many-to-one name="student" column="studentId" unique="true">
</many-to-one>
</class>
unique="true"是保证生成的字段唯一,这样<many-to-one 也达到了一对一的效果
Annotation部分:
Husband.java
package com.bjsxt.hibernate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
@Entity
public class Husband {
private int id;
private String name;
private Wife wife;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToOne
@JoinColumn(name="wifeId")
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
Wife.java
package com.bjsxt.hibernate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Wife {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
XML部分
Student.java
package com.bjsxt.hibernate;
public class Student {
private int id;
private String name;
private int age;
private String sex;
private boolean good;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public boolean isGood() {
return good;
}
public void setGood(boolean good) {
this.good = good;
}
}
StuIdCard.java
package com.bjsxt.hibernate;
public class StuIdCard {
private int id;
private String num;
private Student student;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Student" table="C_student" dynamic-update="true">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<property name="age" />
<property name="sex" />
<property name="good" type="yes_no"></property>
</class>
</hibernate-mapping>
测试源码:
package com.bjsxt.hiberante;
import java.util.Date;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.Session;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.bjsxt.hibernate.Husband;
import com.bjsxt.hibernate.StuIdCard;
import com.bjsxt.hibernate.Student;
import com.bjsxt.hibernate.Wife;
public class HibernateQLTest {
private static SessionFactory sf;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("BeforeClass");
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("AfterClass");
sf.close();
}
//
@Test
public void testSchemaExport(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
@Test
public void testOneTOOne_Wife(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Wife wife = new Wife();
wife.setName("wife");
Husband husband = new Husband();
husband.setName("husband");
husband.setWife(wife);
session.save(wife); //先保存妻子
session.save(husband); //再保存丈夫
session.getTransaction().commit();
}
@Test
public void testOneToOne_Stu(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Student stu = new Student();
stu.setName("student");
stu.setAge(20);
stu.setGood(false);
stu.setSex("man");
StuIdCard idcard = new StuIdCard();
idcard.setStudent(stu);
idcard.setNum("什马卡?");
session.save(stu);
session.save(idcard);
session.getTransaction().commit();
}
/*public static void main(String args[]){
sf = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sf.getCurrentSession();
session.beginTransaction();
Wife wife = new Wife();
wife.setName("wife");
Husband husband = new Husband();
husband.setName("husband");
husband.setWife(wife);
session.save(husband);
session.getTransaction().commit();
sf.close();
}*/
}