hibernate基于Annotation的一对一外键映射


转自http://blog.csdn.net/wangqyoho/article/details/50850105

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

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

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

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

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

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

Manager.Java

  1. package cn.wqy.dao;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.Id;  
  6. import javax.persistence.JoinColumn;  
  7. import javax.persistence.OneToOne;  
  8. import javax.persistence.Table;  
  9.   
  10.   
  11. @Entity  
  12. @Table(name = "manager_backup")  
  13. public class Manager {  
  14.     private int manager_id;  
  15.     private String manager_name;  
  16.     private String manager_password;  
  17.     private Manager_Msg manager_msg;  
  18.   
  19.     @Id  
  20.     public int getManager_id() {  
  21.         return manager_id;  
  22.     }  
  23.   
  24.     @OneToOne  
  25.     @JoinColumn(name="man_id")  
  26.     public Manager_Msg getManager_msg() {  
  27.         return manager_msg;  
  28.     }  
  29.   
  30.     public String getManager_name() {  
  31.         return manager_name;  
  32.     }  
  33.   
  34.     public String getManager_password() {  
  35.         return manager_password;  
  36.     }  
  37.   
  38.     public void setManager_id(int manager_id) {  
  39.         this.manager_id = manager_id;  
  40.     }  
  41.   
  42.     public void setManager_msg(Manager_Msg manager_msg) {  
  43.         this.manager_msg = manager_msg;  
  44.     }  
  45.   
  46.     public void setManager_name(String manager_name) {  
  47.         this.manager_name = manager_name;  
  48.     }  
  49.   
  50.     public void setManager_password(String manager_password) {  
  51.         this.manager_password = manager_password;  
  52.     }  
  53.   
  54. }  

Manager_msg.java:

  1. package cn.wqy.dao;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.persistence.Entity;  
  6. import javax.persistence.Id;  
  7. import javax.persistence.OneToOne;  
  8. import javax.persistence.Table;  
  9.   
  10. @Entity  
  11. @Table(name = "manager_message")  
  12. public class Manager_Msg {  
  13.   
  14.     private int manager_id;  
  15.     private String manager_name;  
  16.     private Date manager_birthday;  
  17.     private Boolean isMarried;  
  18.   
  19.     // private int man_id;  
  20.   
  21.     public Boolean getIsMarried() {  
  22.         return isMarried;  
  23.     }  
  24.   
  25.     public Date getManager_birthday() {  
  26.         return manager_birthday;  
  27.     }  
  28.   
  29.     @Id  
  30.     public int getManager_id() {  
  31.         return manager_id;  
  32.     }  
  33.   
  34.     public String getManager_name() {  
  35.         return manager_name;  
  36.     }  
  37.   
  38.     public void setIsMarried(Boolean isMarried) {  
  39.         this.isMarried = isMarried;  
  40.     }  
  41.   
  42.     public void setManager_birthday(Date manager_birthday) {  
  43.         this.manager_birthday = manager_birthday;  
  44.     }  
  45.   
  46.     public void setManager_id(int manager_id) {  
  47.         this.manager_id = manager_id;  
  48.     }  
  49.   
  50.     public void setManager_name(String manager_name) {  
  51.         this.manager_name = manager_name;  
  52.     }  
  53. }  
上面是两个实体类,manager_msg是主表,manager_backup是从表。

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

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

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

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

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

以下利用JUnit4进行测试

  1. static {  
  2.         Configuration conf = new Configuration();  
  3.         conf.configure();  
  4.     }  
  5.   
  6.     @Test  
  7.     public void testManagerSave() {  
  8.   
  9.         Manager m = new Manager();  
  10.         Manager_Msg msg = null;  
  11.         Session s = HibernateSessionFactory.getSession();  
  12.         Transaction tran = s.beginTransaction();  
  13.           
  14.         m = (Manager) s.get(Manager.class1);  
  15.         msg = m.getManager_msg();  
  16.         s.delete(m);*/  
  17.   
  18.     System.out.println(msg);  
  19.         System.out.println(m);  
  20.         tran.commit();  
  21.         s.close();  
  22.     }  
可以利用外键映射关系找到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中添加如下

配置:

  1. <property name="javax.persistence.validation.mode">none</property>  
即可解决。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值