注解(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入门之类

    在面向对象的语言中,类是最重要的一环,python自然拥有类这个机制.python的类机制,与C++,java的区别不是很大,类的大多数的重要特性都被沿用了,一样可以多态,抽象,封装: python3 ...

  2. java反射介绍

    反射是java中的非常重要的一项机制,也称做reflection.它让java在运行中对自身进行检查,并能直接操作程序的内部属性或方法. 反射机制中常用的类 Reflection api中的内部信息有 ...

  3. 条目二十六《iterator优先于const_iterator、reverse_iterator以及const_reverse_iterator》

    条目二十六<iterator优先于const_iterator.reverse_iterator以及const_reverse_iterator> 这几个东西不是类型来的,而是不同的类,所 ...

  4. 搭建USB摄像头转RTSP服务器的多种方法

    USB摄像头与网络摄像头相比,可选择范围广.种类多.成本低,但是实际使用时需要通过rtsp流来访问,起到直播的效果,因此在摄像头采集终端上构建rtsp流媒体服务器,将USB摄像头数据转化为rtsp,可 ...

  5. 《The One!团队》第一次作业:团队亮相

    项目 内容 作业所属课程 http://www.cnblogs.com/nwnu-daizh/ 作业要求 https://www.cnblogs.com/nwnu-daizh/p/10687492.h ...

  6. Mac os x的发展

    OS X(前称Mac OS X)是苹果公司为麦金塔电脑开发的专属操作系统.Mac OS X于1998年首次推出,并从2002年起随麦金塔电脑发售.它是一套Unix基础的操作系统,包含两个主要的部分:核 ...

  7. python+selenium+pychar安装

    python3.5(在百度输入python进入python官网-downloads-Windows-然后选择要下载的版本(可执行安装包,若电脑为32位的选择×86,若为64的选择×64)) selen ...

  8. python 流式游标读取mysql大型数据库

    import asyncio import aiomysql async def dbdaochu(loop): sqlstr='sql' conn = await aiomysql.connect( ...

  9. C# checked和unchecked运算符

    1.作用 checked和unchecked运算符用于CLR(公共语言运行时)强制对它们所作用的代码块,进行(不进行)代码溢出检测 2.示例说明 有代码如下: static void Main(str ...

  10. 【ExtJS】FormPanel 布局(一)

    准备工作,布置一个最简单的Form,共5个组件,都为textfield. Ext.onReady(function(){ Ext.create('Ext.form.Panel', { width: 5 ...