Hibernate关于一对一注解配置
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
Dept实体类配置
1 package cn.xsy.entity.day_onetoone; 2 3 import javax.persistence.*; 4 5 /** 6 * Created by Administrator on 2017/12/28. 7 */ 8 @Entity 9 @Table(name = "Dept") 10 public class Dept 11 { 12 @Id 13 @GeneratedValue 14 private Integer deptno; 15 private String deptname; 16 17 @OneToOne(mappedBy = "dept",cascade = CascadeType.ALL) 18 19 private Emp emp; 20 21 public Emp getEmp() { 22 return emp; 23 } 24 25 public void setEmp(Emp emp) { 26 this.emp = emp; 27 } 28 29 public Integer getDeptno() { 30 return deptno; 31 } 32 33 public void setDeptno(Integer deptno) { 34 this.deptno = deptno; 35 } 36 37 public String getDeptname() { 38 return deptname; 39 } 40 41 public void setDeptname(String deptname) { 42 this.deptname = deptname; 43 } 44 45 46 }
Emp实体类配置
1 package cn.xsy.entity.day_onetoone; 2 3 import javax.persistence.*; 4 5 /** 6 * Created by Administrator on 2017/12/28. 7 */ 8 @Entity 9 @Table(name = "Emp") 10 public class Emp { 11 12 @Id 13 @GeneratedValue 14 private Integer empno; 15 private String empname; 16 17 @OneToOne 18 @JoinColumn(name = "DE") 19 20 private Dept dept; 21 22 public Dept getDept() { 23 return dept; 24 } 25 26 public void setDept(Dept dept) { 27 this.dept = dept; 28 } 29 30 public Integer getEmpno() { 31 return empno; 32 } 33 34 public void setEmpno(Integer empno) { 35 this.empno = empno; 36 } 37 38 public String getEmpname() { 39 return empname; 40 } 41 42 public void setEmpname(String empname) { 43 this.empname = empname; 44 } 45 46 47 }
hibernate.cfgonetooneexplanatory.xml文件配置(需要指定标识实体类)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 <!--创建Session的基础配置--> 8 <session-factory> 9 <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 10 <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> 11 <property name="connection.username">waxsy</property> 12 <property name="connection.password">bsfm</property> 13 14 <!-- JDBC 连接池(use the built-in) --> 15 <!-- <property name="connection.pool_size">1</property>--> 16 17 <!-- SQL dialect (方言)--> 18 <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> 19 20 <!-- Enable Hibernate's automatic session context management 21 session工厂创建的session和当前线程绑定bind 22 --> 23 <property name="current_session_context_class">thread</property> 24 25 <!-- Disable the second-level cache 启用/关闭二级缓存--> 26 <!-- <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>--> 27 28 <!-- Echo all executed SQL to stdout 在控制台打印sql --> 29 <property name="show_sql">true</property> 30 <!--格式化SQL--> 31 <property name="format_sql">true</property> 32 <!-- Drop and re-create (重新创建)the database schema(架构) on startup (启动) 33 是否根据hbm.xml自动建表 建表的策略 update create 34 hbm配置文件》》》》》》》ddl 数据表 35 create: 过程:先drop 再Create 36 update:检查现有表的架构是否存在,真实开发中,在上线后,一定update 37 --> 38 <property name="hbm2ddl.auto">update</property> 39 <!--关联小配置 --> 40 41 <mapping class="cn.xsy.entity.day_onetoone.Dept"></mapping> 42 <mapping class="cn.xsy.entity.day_onetoone.Emp"></mapping> 43 44 </session-factory> 45 46 </hibernate-configuration 47 >
编写测试类
1 package day01; 2 3 4 5 6 import cn.xsy.entity.day_onetoone.Dept; 7 import cn.xsy.entity.day_onetoone.Emp; 8 import cn.xsy.util.HibernateUtil; 9 import org.hibernate.Query; 10 import org.hibernate.Session; 11 import org.hibernate.Transaction; 12 import org.junit.Test; 13 14 /** 15 * Created by Happy on 2017-12-24. 16 */ 17 public class Test20171230_onetoone { 18 19 //一对一关联 20 @Test 21 public void explanatory(){ 22 Session session= HibernateUtil.getSession(); 23 Transaction tx=session.beginTransaction(); 24 Dept dept=new Dept(); 25 dept.setDeptname("开发部"); 26 dept.setDeptno(19); 27 Emp emp=new Emp(); 28 emp.setEmpno(3); 29 emp.setEmpname("天赐"); 30 dept.setEmp(emp); 31 emp.setDept(dept); 32 session.save(dept); 33 tx.commit(); 34 System.out.println("111111111111"); 35 36 } 37 38 }
效果
Dept中的mappedBy
首先,mappedBy这个注解只能够用在@OntToOne,@OneToMany,@manyToMany中,不能够用在@manyToOne中;
第二,这个注解看网上的意思可以简单地理解为:这个注解用在主表的一方,就是被引用的一方;
第三,这个注解是与@JoinColumn这个注解是互斥的,因为@JoinColumn这个注解使用在拥有外键的表的一方,就是从表的一方。
第四,这个注解的属性值是:指向另外一个类中定义的一个属性,这个属性的类型是当前这个类;有点绕,有点晕,是的;就是说它的属性值指向的是:与之关联类中定义的指向本类的一个属性!