注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

接下来我们讲解一下多对一双向注解:

我以部门表和员工表作为示例讲解。

第一步:创建实体类

Dept(部门表)

package cn.onetomanydouble.entity;

import org.hibernate.annotations.*;
import org.hibernate.annotations.Cache; import javax.persistence.*;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set; /**
* Created by accp on 2017/2/8.
*/
@Entity @Table(name = "DEPT1") public class Dept implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO,generator="PROMOTION_SEQ")
@SequenceGenerator(name="PROMOTION_SEQ",sequenceName="PROMOTION_SEQ",initialValue = ,allocationSize = )
/*
对于oracle想使用各自的Sequence,设置如下:
@GeneratedValue(strategy = GenerationType.AUTO,generator="PROMOTION_SEQ")
@SequenceGenerator(name="PROMOTION_SEQ",sequenceName="PROMOTION_SEQ")
另外:
对于自动增长后,在数据表中的相应字段,要设置字段为auto_increment.
*/
private Integer deptno;
@Column
private String deptname;
@OneToMany(mappedBy ="dept",cascade = {CascadeType.ALL},fetch = FetchType.LAZY)
//mappedBy 属性主要针对外键而言,与之对应的是.xml中的inverse属性
//mappedBy="dept" 是把维护权交给多的一方
@LazyCollection(LazyCollectionOption.FALSE)
private Set<Emp> emps=new HashSet<Emp>();
@Column
private String location; public String getLocation() {
return location;
} public void setLocation(String location) {
this.location = location;
} public Integer getDeptno() {
return deptno;
} public void setDeptno(Integer deptno) {
this.deptno = deptno;
} public String getDeptname() {
return deptname;
} public void setDeptname(String deptname) {
this.deptname = deptname;
} public Set<Emp> getEmps() {
return emps;
} public void setEmps(Set<Emp> emps) {
this.emps = emps;
} }

Emp(员工表)

package cn.onetomanydouble.entity;

import org.hibernate.annotations.*;
import org.hibernate.annotations.Cache; import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable; /**
* Created by accp on 2017/2/8.
*/
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "EMP1")
public class Emp implements Serializable {
@Id
@GeneratedValue
private Integer empno;
@Column
private String ename;
@ManyToOne
@JoinColumn(name = "deptno")
private Dept dept;
/* @Column
private Double salary;
@Column
private String job;*/ /*public Double getSalary() {
return salary;
} public void setSalary(Double salary) {
this.salary = salary;
} public String getJob() {
return job;
} public void setJob(String job) {
this.job = job;
}*/ public Integer getEmpno() {
return empno;
} public void setEmpno(Integer empno) {
this.empno = empno;
} public String getEname() {
return ename;
} public void setEname(String ename) {
this.ename = ename;
} public Dept getDept() {
return dept;
} public void setDept(Dept dept) {
this.dept = dept;
} }

在配置一对多双向的时候一定要搞清楚主外键关系。

第二步:在hibernate.cfg.xml文件中配置<mapping>节点

 <mapping class="cn.onetomanydouble.entity.Dept"/>
<mapping class="cn.onetomanydouble.entity.Emp"/>

第三步:书写测试类

package cn.onetomanydouble.test;

import cn.onetomanydouble.entity.Dept;
import cn.onetomanydouble.entity.Emp;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; /**
* Created by accp on 2017/2/8.
*/
public class ManyToOneTest { Configuration cfg;
Session session;
Transaction tx;
SessionFactory factory;
@Before
public void mybefore(){
cfg=new Configuration().configure();
factory=cfg.buildSessionFactory();
session=factory.openSession();
tx=session.beginTransaction();
} @After
public void myafter(){
tx.commit();
session.close();
} @Test
public void demo(){
System.out.println();
} @Test
public void select(){ /**
* load()方法
* fetch = FetchType.EAGER(立即加载) fetch = FetchType.LAZY(懒加载)
* 情况一:当在一的一方设置是否加载时
* fetch = FetchType.EAGER (立即加载)
* 不查询不发送sql语句
* 左外连接 两表查询
* 查询关联表的属性时 不在重新发送sql
*
*
* fetch = FetchType.LAZY(懒加载)
* 不查询不发送sql语句
* 查询单一属性时 只查询当前表的 当查询关联属性时
* 重新向数据库发送sql
*
* get()方法
* fetch = FetchType.EAGER (立即加载) fetch = FetchType.LAZY(懒加载)
* (1) 情况一:当在多的一方设置
* fetch = FetchType.EAGER (立即加载)
* 先向数据库查询一次
* 左外连接 两表查询
* 当用到属性时 直接打印对应的属性值
*
* fetch = FetchType.LAZY(懒加载)
* 只加载当前类的语句
* 当查询当前表的属性时 只向数据库发送查询当前表的sql
*
* 当查询关联表的属性时 发送关联表的sql语句
*
*/ /*Transaction tx = factory.getCurrentSession().beginTransaction();
Dept dept = factory.getCurrentSession().get(Dept.class, 1);
for (Emp emp:dept.getEmps()) {
System.out.println(emp.getEname());
} tx.commit();
factory.getCurrentSession().close(); System.out.println("=====================");
Transaction tx2 = factory.getCurrentSession().beginTransaction();
Dept dept2 = factory.getCurrentSession().get(Dept.class, 1);
for (Emp emp:dept2.getEmps()) {
System.out.println(emp.getEname());
}
tx2.commit();
*/
Dept dept = session.get(Dept.class, );
System.out.println("=============");
System.out.println(dept.getClass());
System.out.println(dept.getDeptname());
System.out.println(dept.getEmps().iterator().next().getEname()); /* Emp emp = session.get(Emp.class, 2);
System.out.println("===========");*/
/* System.out.println(emp.getEname());
System.out.println(emp.getDept().getDeptname());*/ } @Test
public void add(){
/*//创建部门
Dept dept=new Dept();
dept.setDeptname("产品部"); //创建员工
Emp emp=new Emp();
emp.setEname("刘二雄");
emp.setDept(dept);
dept.getEmps().add(emp);
//因为cascade级联只需保存部门即可保存员工
session.save(dept);*/ Dept dept=new Dept();
dept.setDeptname("清洁部"); //创建员工
Emp emp=new Emp();
emp.setEname("飘哥");
emp.setDept(dept);
dept.getEmps().add(emp);
session.save(dept);
}
}

执行完代码后一定要看看生成的sql语句,加深印象。

Hibernate 注解 (Annotations 三)多对一双向注解的更多相关文章

  1. Hibernate 注解(Annotations 四)多对多双向注解

    注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...

  2. Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)

    本文知识点(目录): 1.Annotation 注解版(只是测试建表)    2.XML版 的实现(只是测试建表)    3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...

  3. Hibernate(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我 们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看 ...

  4. Hibernate 注解(Annotations 二)一对一双向注解

    注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...

  5. hibernate之实体@onetomany和@manytoone双向注解(转)

    下面是User类: @onetomany @Entity @Table(name="user") public class User implements Serializable ...

  6. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

  7. Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

    One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...

  8. hibernate one-to-many many-to-one 双向注解

    建表语句: DROP TABLE IF EXISTS `t_company`; CREATE TABLE `t_company` ( `companyId` ) unsigned NOT NULL A ...

  9. 使用Hibernate注解Annotations进行对象映射的异常处理

    通过Hibernate注解Annotations进行对象映射,想在Oracle数据库中自动创建表,代码如下: 实体类: import javax.persistence.Basic;import ja ...

随机推荐

  1. python3的enumerate函数

    enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中.

  2. Python自动发送HTML测试报告

    在我们做自动化测试的时候,执行完所有的测试用例,我们是希望马上得到结果的,那么我们不可能一直盯着去看,这个时候就需要引入邮件功能 1.首先我们使用一个python的第三方发邮件的库 yagmail g ...

  3. js 平均分割

    let alllist=res.data; var result = []; for (var i = 0; i < alllist.length; i += 3) { result.push( ...

  4. 用 gdb 和 qemu 调试 grub

    因为qemu内置了gdbserver,所以我们可以用gdb调试qemu虚拟机上执行的代码,而且不受客户机系统限制. 以下内容是我调试 grub 0.97 时的一份笔记. 准备 qemu, gdb,以及 ...

  5. AVL树插入(Python实现)

    建立AVL树 class AVLNode(object): def __init__(self,data): self.data = data self.lchild = None self.rchi ...

  6. 求一个n元一次方程的解,Gauss消元

    求一个n元一次方程的解,Gauss消元 const Matrix=require('./Matrix.js') /*Gauss 消元 传入一个矩阵,传出结果 */ function Gauss(mat ...

  7. laravel5.8的使用

    首先,确定电脑已经安装了composer.最好是全局安装 然后打开phpstorm的控制台: composer create-project --prefer-dist laravel/laravel ...

  8. 固定定位 z-index iconfont的使用 043

    固定定位  现象 脱标 提升层级  将盒子固定住 参考点 浏览器的左上角 : <!DOCTYPE html> <html lang="en"> <he ...

  9. CentOS&.NET Core初试-3-Nginx的安装和配置

    系列目录 CentOS的安装和网卡的配置 安装.NET Core SDK和发布网站 Nginx的安装和配置 安装守护服务(Supervisor) Nginx简介   Nginx是一个免费的,开源的,高 ...

  10. JS之作用域与闭包

    JS之作用域与闭包   作用域在JS中同样也是一个重要的概念.它不复杂,因为ES5中只有全局作用域和函数作用域,我们都知道他没有块级作用域.但在ES6中多了一个let,他可以保证外层块不受内层块的影响 ...