- package com.hibernate.entity;
- import java.io.Serializable;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.OneToOne;
- @Entity
- public class Husband implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 2476364405175138004L;
- private int id;
- private String name;
- private Wife wife;
- @Id
- @GeneratedValue
- public int getId() {
- return id;
- }
- public String getName() {
- return name;
- }
- @OneToOne
- public Wife getWife() {
- return wife;
- }
- public void setId(int id) {
- this.id = id;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setWife(Wife wife) {
- this.wife = wife;
- }
- }
- package com.hibernate.entity;
- import java.io.Serializable;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.OneToOne;
- @Entity
- public class Wife implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 5270130768836331730L;
- private int id;
- private String name;
- private Husband husband;
- @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(mappedBy="wife")
- public Husband getHusband() {
- return husband;
- }
- public void setHusband(Husband husband) {
- this.husband = husband;
- }
- }
注意:Wife类的getHusband()上用了mappedBy"wife"
这个意思是说,我这里的OneToOne就不用管了,只用Husband里的getWife()上的OneToOne关系
生成的表为Husband参考Wife,有了wifeid,才能有Husband
Husband为这个关系的拥有者
如果Wife类的getHusband()只有@OneToOne,没有mappedBy,那么生成的两张表都会有对方的外键,造成外键冗余。
Test.java
package com.fancy.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import com.fancy.po.Card;
import com.fancy.po.Person;
/**
* -----------------------------------------
* @文件: Test.java
* @作者: fancy
* @邮箱: fancyzero@yeah.net
* @时间: 2012-6-10
* @描述: 测试类
* -----------------------------------------
*/
public class Test {
public static void main(String[] args) {
//读取hibernate配置,默认读取classpath下的hibernate.cfg.xml
Configuration conf = new AnnotationConfiguration();
//构建session工厂
SessionFactory sessionFactory = conf.configure().buildSessionFactory();
//打开session
Session session = sessionFactory.openSession();
//开始事务
session.beginTransaction();
// * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//test1(session); //测试 1
//test2(session); //测试 2
test3(session); //测试 3
// * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//提交事务
session.getTransaction().commit();
//关闭session工厂
sessionFactory.close();
//关闭session
session.close();
}
/**
* 数据库初始值:
* personName:fancy
* cardNumber:440911199008011122
*/
//测试方法1
public static void test1(Session session){
Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
Card card = person.getCard();
System.out.println(person.getPersonName());
System.out.println(card.getCardNumber());
person.setPersonName("fancy"); //与初始值一致
card.setCardNumber("440911199008011122");//与初始值一致
session.save(person); //不发出sql语句
//session.save(card); //不发出sql语句
}
//测试方法2
public static void test2(Session session){
Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
Card card = person.getCard();
System.out.println(person.getPersonName());
System.out.println(card.getCardNumber());
person.setPersonName("fancyzero"); //与初始值不一致
card.setCardNumber("440911199008011122");//与初始值一致
session.save(person); //发出Person的update语句,数据库中personName被修改,不发出Card的update语句
//session.save(card); //发出Person的update语句,数据库中personName被修改,不发出Card的update语句
}
//测试方法3
public static void test3(Session session){
Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
Card card = person.getCard();
System.out.println(person.getPersonName());
System.out.println(card.getCardNumber());
person.setPersonName("fancy"); //与初始值不一致
card.setCardNumber("440911199008080808");//与初始值不一致
session.save(person); //同时发出Person和Card的update语句,数据库中的数据相应被修改
//session.save(card); //同时发出Person和Card的update语句,数据库中的数据相应被修改
}
}