转自http://blog.csdn.net/wangqyoho/article/details/50850105
首先需要弄清楚什么是外键。如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此
可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从
表。外键又称作外关键字。
利用外键建立起来的一对一映射,一对一的连接了两张表,使其具有了唯一的映射关系。这种映射就叫作一对一外键映射。
在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的实体类中添加了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();
- }
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>