Hibernate学习——(五)基于Annotation的一对一外键映射

首先需要弄清楚什么是外键。如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此

可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从

表。外键又称作外关键字。

利用外键建立起来的一对一映射,一对一的连接了两张表,使其具有了唯一的映射关系。这种映射就叫作一对一外键映射。

在Hibernate中,可以采用Xml的方式配置,也可以采用annotation的方式配置。由于annotation的配置方式相当简便而且一目了

然,因此直接采用annotation的配置。

Manager.java:

package cn.wqy.dao;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;


@Entity
@Table(name = "manager_backup")
public class Manager {
	private int manager_id;
	private String manager_name;
	private String manager_password;
	private Manager_Msg manager_msg;

	@Id
	public int getManager_id() {
		return manager_id;
	}

	@OneToOne
	@JoinColumn(name="man_id")
	public Manager_Msg getManager_msg() {
		return manager_msg;
	}

	public String getManager_name() {
		return manager_name;
	}

	public String getManager_password() {
		return manager_password;
	}

	public void setManager_id(int manager_id) {
		this.manager_id = manager_id;
	}

	public void setManager_msg(Manager_Msg manager_msg) {
		this.manager_msg = manager_msg;
	}

	public void setManager_name(String manager_name) {
		this.manager_name = manager_name;
	}

	public void setManager_password(String manager_password) {
		this.manager_password = manager_password;
	}

}

Manager_msg.java:

package cn.wqy.dao;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "manager_message")
public class Manager_Msg {

	private int manager_id;
	private String manager_name;
	private Date manager_birthday;
	private Boolean isMarried;

	// private int man_id;

	public Boolean getIsMarried() {
		return isMarried;
	}

	public Date getManager_birthday() {
		return manager_birthday;
	}

	@Id
	public int getManager_id() {
		return manager_id;
	}

	public String getManager_name() {
		return manager_name;
	}

	public void setIsMarried(Boolean isMarried) {
		this.isMarried = isMarried;
	}

	public void setManager_birthday(Date manager_birthday) {
		this.manager_birthday = manager_birthday;
	}

	public void setManager_id(int manager_id) {
		this.manager_id = manager_id;
	}

	public void setManager_name(String manager_name) {
		this.manager_name = manager_name;
	}
}
上面是两个实体类,manager_msg是主表,manager_backup是从表。

由于要添加映射关系,所以在manager的实体类中添加了manager_msg对象属性及其getter、setter方法。在manager_msg的

getter方法上加上了@oneToOne注解。同时加上了@joinColumn注解,利用其中属性表示了是对其man_id字段添加外键约束,从表中有一名为

man_id的列,默认和主表的主键关联。如果不想关联主键,可以重新指定,设置referencedColumnName的值,指定要关联的列名。

之后在hibernate.cfg.xml中加入类的映射:

	<mapping class="cn.wqy.dao.Manager_Msg"/>
	<mapping class="cn.wqy.dao.Manager" />
即可。

以下利用JUnit4进行测试:

static {
		Configuration conf = new Configuration();
		conf.configure();
	}

	@Test
	public void testManagerSave() {

		Manager m = new Manager();
		Manager_Msg msg = null;
		Session s = HibernateSessionFactory.getSession();
		Transaction tran = s.beginTransaction();
		
		m = (Manager) s.get(Manager.class, 1);
		msg = m.getManager_msg();
		s.delete(m);*/

	System.out.println(msg);
		System.out.println(m);
		tran.commit();
		s.close();
	}
可以利用外键映射关系找到msg对象。

Ps:在用MyEclipse10(JavaEE5)开发时,导入其自身对Hibernate的支持和junit4之后,会发现报错,这是由于JavaEE5的

@oneToOne缺少一个方法而导致。删除Java EE 5 Libraries,添加Java EE 6 Libraries。会发现报Error applying BeanValidation 

relational constraints,这是因为在J2EE6中javax.persistence.validation.mode默认情况下是auto,如果不设置的话会自动去自己的

classpath下找一个bean-validation的包,找不到,所以会报beanvalidationFactory的错。解决方法是在hibernate.cfg.xml中添加如下

配置:

<property name="javax.persistence.validation.mode">none</property>
即可解决。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值