以下示例均爲雙向關聯,
一對一:
學生證表和學生表,學生證表中有學生的id,理論上,一對一完全可以合成爲一張表,
學生證表對應的entity:
package com.entity;
public class Paper {
private Integer id;
private String desc;
private Student student;
public Paper() {
super();
}
public Paper(String desc) {
super();
this.desc = desc;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
學生表對應的entity:
package com.entity;
public class Student {
private Integer id;
private String name;
private Paper paper;
public Student() {
super();
}
public Student(String name) {
super();
this.name = name;
}
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 Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
}
學生證表Paper.hbm.xml:
表中字段設置,實體類和數據庫表字段一一對應,值得一提的是,hibernate提供了主鍵的自增,如果在這裏設置自增的話,增加數據的時候,會先執行一條判斷當前數據庫主鍵的最大值,然後從最大值+1保存,這個機制比數據庫自身的sequence要好用得多;
數據庫是不會判斷兩個表是一對一還是多對多的,數據庫只認外鍵,就是說設置有外鍵的表爲多的一方,而另外的一方爲對應的一的一方,因此此處學生證表中設置爲many-to-one,
與數據庫相照應,
<?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 package="com.entity">
<class name="Paper" table="PAPER">
<id name="id" type="integer" column="ID" >
<generator class="increment"/>
</id>
<property name="desc" column="STU_DESC"></property>
<many-to-one name="student" class="Student" column="STU_ID" unique-key="true" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
學生表的xml:
<hibernate-mapping package="com.entity">
<class name="Student" table="STUDENT">
<id name="id" type="integer" column="ID" >
<generator class="increment"/>
</id>
<property name="name" column="NAME"></property>
<one-to-one name="paper" class="Paper"></one-to-one>
</class>
</hibernate-mapping>
下面是測試類:
package com.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.entity.Paper;
import com.entity.Student;
public class TestOne2One {
public static void main(String[] args) {
TestOne2One test = new TestOne2One();
test.add();
}
public void add() {
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Student student = new Student("李四");
Paper paper = new Paper();
paper.setDesc("1010111021545");
paper.setStudent(student);
// student.setPaper(paper);
Transaction tr = session.beginTransaction();
// session.save(student);//如果想用級聯的話,需要從從表尋找主表,在從表的配置中,設置cascade;
//不用級聯的話,可以雙向關聯,然後save主表,即student
session.save(paper);
tr.commit();
session.close();
factory.close();
}
public void query(){
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Paper paper = (Paper) session.get(Paper.class, 1);
Student student = paper.getStudent();
System.out.println(student.getName());
session.close();
factory.close();
}
public void delete(){
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction tr = session.beginTransaction();
Paper paper = (Paper) session.get(Paper.class, 2);
session.delete(paper);
tr.commit();
session.close();
factory.close();
}
}