首页 > 代码库 > Hibernate一对一关联

Hibernate一对一关联

一对一单向外键关联

1.建Husband实体类和Wife实体类,添加Annotation注解,如下

@Entitypublic 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                   //Husband和Wife是一对一的关系	public Wife getWife() {		return wife;	}	public void setWife(Wife wife) {		this.wife = wife;	}}

 

@Entitypublic 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;	}}

 

2.在hibernate.cfg.xml中添加mapping语句

<mapping class="com.hibernate.model.Husband"/> <mapping class="com.hibernate.model.Wife"/>

3.建Junit测试类

public class ORMappingTest {	@Test	public void test() {		//生成表,输出建表语句		new SchemaExport(new Configuration().configure()).create(true, true);	}}

程序至此结束,运行程序,在数据库中生成Husband表和Wife表,并在控制台输出建表语句。

Husband表中会自动生成属性名为“wife_id”的外键,参考表为Wife表。

如果想要使用自定义的外键属性名,可对Husband实体类的getWife方法添加Annotation注解,如下:

@OneToOne   //Husband和Wife是一对一的关系@JoinColumn(name="wifeId")  // java默认生成的外键属性名为wife_id.设置此项后,可以任意设定其属性名,此处设置为wifeId.public Wife getWife() {	return wife;	}

一对一双向外键关联

1.建Husband实体类和Wife实体类,添加Annotation注解

Husband类同上,只需在Wife类中增加一个Husband类型的变量,并添加@OneToOne注解即可,如下

@Entitypublic class Wife {	private int id;	private String name;		private Husband husband;   //建一个Husband类型的变量,并生成setter和getter方法 		@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")     //"wife"指的是Husband类中的private Wife wife;	public Husband getHusband() {		return husband;	}	public void setHusband(Husband husband) {		this.husband = husband;	}	}

凡是双向关联,必设mappedBy

2.在hibernate.cfg.xml中添加mapping语句----同上

3.建Junit测试类----同上

程序至此结束,运行程序,在数据库中生成Husband表和Wife表,并在控制台输出建表语句。

联合主键

联合主键(3种方式)    将组件类注解为@Embeddable,并将组件的属性注解为@Id (不常用)    将组件的属性注解为@EmbeddedId      将实体类注解为@IdClass(组件类.class),并将该实体类中所有属于主键的属性都注解为@Id

示例:建Wife表,属性有id,name,age。其中id和name为联合主键

1.建组件类WifePK

/* * 建立组件类WifePK * 需实现Serializable接口,此接口用于把当前类的接口进行序列化 * 需重写equals()和hashCode()方法,以保证对象的唯一性 *   **/public class WifePK implements java.io.Serializable{	private int id;	private String name;	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;	}		@Override	public boolean equals(Object o){		if(o instanceof WifePK){			WifePK pk = (WifePK) o;			if(this.id == pk.getId() && this.name.equals(pk.getName())){				return true;			}		}		return false;	}		@Override	public int hashCode(){		return this.name.hashCode();	}}

2.建实体类Wife

第二种方式注解,@EmbeddedId

@Entitypublic class Wife {		private WifePK pk;    //增加WifePK类型的变量,并添加getter和setter方法		private int age;		@EmbeddedId              //将其注解为联合主键	public WifePK getPk() {		return pk;	}	public void setPk(WifePK pk) {		this.pk = pk;	}	public int getAge() {		return age;	}	public void setAge(int age) {		this.age = age;	}}

第三种方式注解,@IdClass

@Entity@IdClass(WifePK.class)   //将实体类注解为@IdClasspublic class Wife {		private int id;	private String name;	private int age;	@Id               //将该实体类中属于主键的属性注解为@Id 	public int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	@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;	}}

3.写Junit测试类

第二种方式注解,@EmbeddedId

public class WifeTest {private static SessionFactory sf = null;		@BeforeClass	public static void beforeClass() {		sf = new Configuration().configure().buildSessionFactory();	}		@AfterClass	public static void afterClass() {		sf.close();	}	@Test	public void test() {				WifePK pk = new WifePK();		pk.setId(1);		pk.setName("zhangsan");				Wife wife = new Wife();		wife.setPk(pk);		wife.setAge(32);				Session session = sf.getCurrentSession();		session.beginTransaction();				session.save(wife);				session.getTransaction().commit();	}}

第三种方式注解,@IdClass,只需修改其test()方法,如下:

@Test	public void test() {				Wife wife = new Wife();		wife.setId(1);		wife.setName("zhangsan");		wife.setAge(32);				Session session = sf.getCurrentSession();		session.beginTransaction();				session.save(wife);				session.getTransaction().commit();	}

程序至此结束,运行程序,在数据库中生成Wife表,id和name为主键,并将对象wife存入Wife表。

联合主键关联

示例:

         建Husband表,属性有id和name

         建Wife表,属性有id,name,age。其中id和name为联合主键

         设置联合主键关联,在Husband表中生成属性名为wife_id和wife_name的外键,分别参考Wife表中的id和name

        

1.建Husband实体类、Wife实体类和WifePK组件类,添加Annotation注解

Husband类,同上

WifePK类,同上

Wife类,同“联合主键”部分第三种方式注解的Wife实体类

2.在hibernate.cfg.xml中添加mapping语句----同上

3.建Junit测试类ORMappingTest----同上

程序至此结束,运行程序,在数据库中生成Husband表和Wife表,并在控制台输出建表语句。

Husband表中会自动生成属性名为“wife_id”和“wife_name”的外键,参考表为Wife表。

如果想要使用自定义的外键属性名,可对Husband实体类的getWife方法添加Annotation注解,如下:

@OneToOne	@JoinColumns(			{				@JoinColumn(name="wifeId",referencedColumnName="id"),				@JoinColumn(name="wifeName",referencedColumnName="name")			}	)	public Wife getWife() {		return wife;	}