博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate单向关联N-1
阅读量:2495 次
发布时间:2019-05-11

本文共 4216 字,大约阅读时间需要 14 分钟。

无连接表的N-1关联

多个Employee关联一个Department。

Employee实体(N端):

package com.ydoing.hibernate2;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToOne;import javax.persistence.Table;@Entity@Table(name = "employee_inf")public class Employee {    @Id    @Column(name = "employee_id")    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;    // N-1单向关联    @ManyToOne(targetEntity = Department.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)    @JoinColumn(name = "department_id", nullable = false)    private Department department;      ....省略get和set方法...

Department实体(1端):

package com.ydoing.hibernate2;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "department_inf")public class Department {
@Id @Column(name = "department_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; ....省略get和set方法...

测试:

package com.ydoing.hibernate2;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.junit.BeforeClass;import org.junit.Test;public class Main {    private static Session session;    @BeforeClass    public static void init() {        Configuration conf = new Configuration();        conf.configure();        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(conf.getProperties())                .build();        SessionFactory factory = conf.buildSessionFactory(serviceRegistry);        session = factory.openSession();    }    @Test    public void test() {        Employee emp = new Employee();        emp.setName("Jack");        emp.setAge(20);        emp.setDepartment(new Department("dev"));        Transaction tx = session.getTransaction();        tx.begin();        session.save(emp);        tx.commit();        session.close();    }}

Console输出:

Hibernate:     insert     into        department_inf        (name)     values        (?)Hibernate:     insert     into        employee_inf        (age, department_id, name)     values        (?, ?, ?)

从以上输出不能看出,Hibernate先插入主表address_inf,然后再持久化从表employee_inf。并没有连接表生成。但是employee_inf多出来外键列department_id。

数据表:

这里写图片描述
这里写图片描述

有连接表的N-1关联

还是用以上的列子,修改Employee类:

package com.ydoing.hibernate2;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToOne;import javax.persistence.Table;@Entity@Table(name = "employee_inf")public class Employee {
@Id @Column(name = "person_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; //N-1单向有连接表关联 @ManyToOne(targetEntity = Department.class, cascade = CascadeType.ALL) // @JoinColumn(name = "department_id", nullable = false) @JoinTable(name = "employee_department", // 连接表名 joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "person_id", unique = true), inverseJoinColumns = @JoinColumn(name = "department_id", referencedColumnName = "department_id")) private Department department; ....省略get和set方法...

Console输出:

Hibernate:     insert     into        department_inf        (name)     values        (?)Hibernate:     insert     into        employee_inf        (age, name)     values        (?, ?)Hibernate:     insert     into        employee_department        (department_id, person_id)     values        (?, ?)

从输出可以看出,Hiberate主动创建了employee_department表,并把employee_inf和department_inf两个表关联起来,还有这两个表都没有增加外键列。

数据表:

这里写图片描述
这里写图片描述
这里写图片描述

你可能感兴趣的文章
Django 源码阅读:url解析
查看>>
Docker面试题(一)
查看>>
第一轮面试题
查看>>
2020-11-18
查看>>
Docker面试题(二)
查看>>
一、redis面试题及答案
查看>>
消息队列2
查看>>
C++ 线程同步之临界区CRITICAL_SECTION
查看>>
测试—自定义消息处理
查看>>
MFC中关于虚函数的一些问题
查看>>
根据图层名获取图层和图层序号
查看>>
规范性附录 属性值代码
查看>>
提取面狭长角
查看>>
Arcsde表空间自动增长
查看>>
Arcsde报ora-29861: 域索引标记为loading/failed/unusable错误
查看>>
记一次断电恢复ORA-01033错误
查看>>
C#修改JPG图片EXIF信息中的GPS信息
查看>>
从零开始的Docker ELK+Filebeat 6.4.0日志管理
查看>>
How it works(1) winston3源码阅读(A)
查看>>
How it works(2) autocannon源码阅读(A)
查看>>