注解(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. 动态sql语句和动态传入参数个数

    1.可以将要传入的几个参数封装成一个实体类,然后将实体类作为一个参数传入到相应的方法中,这时候就需要这sqlMapper.xml文件中对传入的字段利用<if test=""& ...

  2. iOS核心动画CALayer和UIView

    UIView和CALayer的关系. 每一个UIview都有一个CALayer实例的图层属性,也就是所谓的backing layer. 实际上这些背后关联的图层才是真正用来在屏幕上显示和做动画,UIV ...

  3. P4098 [HEOI2013]ALO 可持久化01Trie

    $ \color{#0066ff}{ 题目描述 }$ Welcome to ALO ( Arithmetic and Logistic Online).这是一个 VR MMORPG, 如名字所见,到处 ...

  4. es去重查询

    {     "query": {                 "bool": {                     "must": ...

  5. apache的应用(发布目录,黑白名单,虚拟主机,PHP-cgi支持,正向代理,https加密,)

    [root@apache1 ~]# yum install httpd -y [root@apache1 ~]# cd /var/www/html/   进入默认发布目录 [root@apache1 ...

  6. C++经典面试题汇总

    1. 下面代码输出什么?为什么?(初始化列表) #include<iostream> using namespace std; class Test { int m_i; int m_j; ...

  7. MVC 和 MVR 的区别分析

    MVC模式中,可以将路由绑定到控制器上.MVR是一对一的.路由和控制器是一个东西. 优点是需要被迫处理路由.缺点是不能在控制器被绑定到路由之前复用控制器. [1] node.js - Differen ...

  8. Leo-io 的C语言实现简单五子棋游戏观后感

    源代码: /************************************************************** ** 文 件 名:wuziqi.cpp ** 功    能:扫 ...

  9. js复习知识点

    null和undefined具体在什么时候使用? 如果定义的变量准备用来保存对象,那么最好用将改变量初始化为null而不是其他值 如果未定义的值可以用空字符 undefined是null派生出来的,所 ...

  10. Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)

    最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分析(必须要弄清楚自己的目的),另外就是要考虑对爬取的数据归类,存储. ...