映射单向多对一的关联关系

新建Customer.java:

package com.dx.jpa.singlemanytoone;import java.util.Date;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;@Entity
@Table(name = "jpa_customer")
public class Customer {private Integer id;private String fullName;private Integer age;private Date birth;private Date createDate;@Id@GeneratedValue(strategy = GenerationType.AUTO)public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Column(name = "FULL_NAME", length = 64, nullable = false)public String getFullName() {return fullName;}public void setFullName(String fullName) {this.fullName = fullName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Temporal(TemporalType.DATE)public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}@Temporal(TemporalType.TIMESTAMP)public Date getCreateDate() {return createDate;}public void setCreateDate(Date createDate) {this.createDate = createDate;}// 帮助方法,不希望保存到数据库,但是需要动态获取Customer对象的属性。
    @Transientpublic String getCustomerInfo() {return "username:" + fullName + ",age:" + age;}
}

View Code

Order.java:

package com.dx.jpa.singlemanytoone;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;@Entity
@Table(name = "jpa_order")
public class Order {private Integer id;private String name;private Customer customer;@Id@GeneratedValue(strategy = GenerationType.AUTO)public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}// @JoinColumn来映射外键// @ManyToOne映射单项一对多映射关系@JoinColumn(name = "CUSTOMER_ID")@ManyToOne()public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}}

Client.java测试类:

package com.dx.jpa.singlemanytoone;import java.util.Date;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;import org.hamcrest.CustomTypeSafeMatcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;public class Client {private String persistenceUnitName = "Jpa-helloword";private EntityManagerFactory entityManagerFactory = null;private EntityManager entityManager = null;private EntityTransaction entityTransaction = null;@Beforepublic void init() {// 1.创建EntityManagerFactoryentityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);// 2.创建EntityManagerentityManager = entityManagerFactory.createEntityManager();// 3.开始事务entityTransaction = entityManager.getTransaction();entityTransaction.begin();}@Afterpublic void destory() {// 5.提交事务
        entityTransaction.commit();// 6.关闭EntityManager
        entityManager.close();// 7.关闭EnityManagerFactory
        entityManagerFactory.close();}
}

View Code

将Customer,Person添加到jpa配置文件persistence.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="Jpa-helloword"transaction-type="RESOURCE_LOCAL"><!-- 配置使用什么 ORM 产品来作为 JPA 的实现 --><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><!-- 添加持久化类 --><class>com.dxsoft.jpa.helloword.Person</class><class>com.dx.jpa.singlemanytoone.Customer</class><class>com.dx.jpa.singlemanytoone.Order</class><properties><!-- 数据库的相关配置 --><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /><property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/jpa" /><property name="javax.persistence.jdbc.user" value="root" /><property name="javax.persistence.jdbc.password" value="root" /><!-- 指定方言 MySQL                org.hibernate.dialect.MySQLDialectMySQL with InnoDB    org.hibernate.dialect.MySQLInnoDBDialectMySQL with MyISAM    org.hibernate.dialect.MySQLMyISAMDialectMySQL5                org.hibernate.dialect.MySQL5DialectMySQL5 with InnoDB    org.hibernate.dialect.MySQL5InnoDBDialect--><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /><property name="hibernate.show_sql" value="true" /><property name="hibernate.format_sql" value="true" /><!-- create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。<br>create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。<br>update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。<br>validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 <br> --><property name="hibernate.hbm2ddl.auto" value="update" />            </properties></persistence-unit>
</persistence>

View Code

执行初始化时,创建表打印语句如下:

Hibernate: create table jpa_customer (id integer not null,age integer,birth date,createDate datetime,FULL_NAME varchar(64) not null,primary key (id)) engine=InnoDB
Hibernate: create table jpa_order (id integer not null,name varchar(255),CUSTOMER_ID integer,primary key (id)) engine=InnoDB
Hibernate: alter table jpa_order add constraint FK7glkngwj74nr8h2amofkp1fjd foreign key (CUSTOMER_ID) references jpa_customer (id)

此时查看表,发现jpa_order表上新建了外键:

测试添加:

添加测试函数:

    @Testpublic void testPersist() {Customer customer = new Customer();customer.setFullName("AA");customer.setAge(26);customer.setBirth(new Date());customer.setCreateDate(new Date());Order order1 = new Order();order1.setName("O-AA-01");order1.setCustomer(customer);Order order2 = new Order();order2.setName("O-AA-02");order2.setCustomer(customer);entityManager.persist(customer);entityManager.persist(order1);entityManager.persist(order2);}

此时打印语句为:

Hibernate: selectnext_val as id_val fromhibernate_sequence for updateHibernate: updatehibernate_sequence setnext_val= ? wherenext_val=?
Hibernate: selectnext_val as id_val fromhibernate_sequence for updateHibernate: updatehibernate_sequence setnext_val= ? wherenext_val=?
Hibernate: selectnext_val as id_val fromhibernate_sequence for updateHibernate: updatehibernate_sequence setnext_val= ? wherenext_val=?
Hibernate: insert intojpa_customer(age, birth, createDate, FULL_NAME, id) values(?, ?, ?, ?, ?)
Hibernate: insert intojpa_order(CUSTOMER_ID, name, id) values(?, ?, ?)
Hibernate: insert intojpa_order(CUSTOMER_ID, name, id) values(?, ?, ?)

View Code

修改customer,order1,order2添加顺序:

    @Testpublic void testPersist() {Customer customer = new Customer();customer.setFullName("BB");customer.setAge(26);customer.setBirth(new Date());customer.setCreateDate(new Date());Order order1 = new Order();order1.setName("O-BB-01");order1.setCustomer(customer);Order order2 = new Order();order2.setName("O-BB-02");order2.setCustomer(customer);entityManager.persist(order1);entityManager.persist(order2);entityManager.persist(customer);}

执行打印sql语句如下:

Hibernate: selectnext_val as id_val fromhibernate_sequence for updateHibernate: updatehibernate_sequence setnext_val= ? wherenext_val=?
Hibernate: selectnext_val as id_val fromhibernate_sequence for updateHibernate: updatehibernate_sequence setnext_val= ? wherenext_val=?
Hibernate: selectnext_val as id_val fromhibernate_sequence for updateHibernate: updatehibernate_sequence setnext_val= ? wherenext_val=?
Hibernate: insert intojpa_order(CUSTOMER_ID, name, id) values(?, ?, ?)
Hibernate: insert intojpa_order(CUSTOMER_ID, name, id) values(?, ?, ?)
Hibernate: insert intojpa_customer(age, birth, createDate, FULL_NAME, id) values(?, ?, ?, ?, ?)
Hibernate: updatejpa_order setCUSTOMER_ID=?,name=? whereid=?
Hibernate: updatejpa_order setCUSTOMER_ID=?,name=? whereid=?

View Code

从打印信息中可以看出,此时是先插入的order,之后在修改其customer_id。比起之前的那种写法多出来了两次修改。

测试查询:

添加测试查询函数:

    @Testpublic void testSelect() {Order order = entityManager.find(Order.class, 3);System.out.println(order.getName());//System.out.println(order.getCustomer().getFullName());}

此时执行打印sql语句为:

Hibernate: selectorder0_.id as id1_1_0_,order0_.CUSTOMER_ID as CUSTOMER3_1_0_,order0_.name as name2_1_0_,customer1_.id as id1_0_1_,customer1_.age as age2_0_1_,customer1_.birth as birth3_0_1_,customer1_.createDate as createDa4_0_1_,customer1_.FULL_NAME as FULL_NAM5_0_1_ fromjpa_order order0_ left outer joinjpa_customer customer1_ on order0_.CUSTOMER_ID=customer1_.id whereorder0_.id=?

从sql语句可以看出即使不插叙customer信息,也会使用left outer join把customer信息给关联出来。

修改Order的getCustomer方法的属性:

修改Order属性为:

重新测试查询:

    @Testpublic void testSelect() {Order order = entityManager.find(Order.class, 2);System.out.println("------------------------");System.out.println(order.getName());System.out.println("------------------------");System.out.println(order.getCustomer().getFullName());System.out.println("------------------------");}

打印sql语句为:

Hibernate: selectorder0_.id as id1_1_0_,order0_.CUSTOMER_ID as CUSTOMER3_1_0_,order0_.name as name2_1_0_ fromjpa_order order0_ whereorder0_.id=?
------------------------
O-BB-02
------------------------
Hibernate: selectcustomer0_.id as id1_0_0_,customer0_.age as age2_0_0_,customer0_.birth as birth3_0_0_,customer0_.createDate as createDa4_0_0_,customer0_.FULL_NAME as FULL_NAM5_0_0_ fromjpa_customer customer0_ wherecustomer0_.id=?
BB
------------------------

查询修改:

添加修改测试:

    @Testpublic void testUpdate() {Order order = entityManager.find(Order.class, 1);order.setName("O-BBB-01");order.getCustomer().setFullName("BBB");}

打印执行sql:

Hibernate: selectorder0_.id as id1_1_0_,order0_.CUSTOMER_ID as CUSTOMER3_1_0_,order0_.name as name2_1_0_ fromjpa_order order0_ whereorder0_.id=?
Hibernate: selectcustomer0_.id as id1_0_0_,customer0_.age as age2_0_0_,customer0_.birth as birth3_0_0_,customer0_.createDate as createDa4_0_0_,customer0_.FULL_NAME as FULL_NAM5_0_0_ fromjpa_customer customer0_ wherecustomer0_.id=?
Hibernate: updatejpa_order setCUSTOMER_ID=?,name=? whereid=?
Hibernate: updatejpa_customer setage=?,birth=?,createDate=?,FULL_NAME=? whereid=?

View Code

查询删除:

测试删除多的一端:

    @Testpublic void testRemove() {Order order = entityManager.find(Order.class, 1);entityManager.remove(order);        }

执行打印语句:

Hibernate: selectorder0_.id as id1_1_0_,order0_.CUSTOMER_ID as CUSTOMER3_1_0_,order0_.name as name2_1_0_ fromjpa_order order0_ whereorder0_.id=?
Hibernate: delete fromjpa_order whereid=?

删除一的一端,此时其在多的一端还对应的有数据记录:

执行测试函数:

    @Testpublic void testRemove() {Customer customer = entityManager.find(Customer.class, 3);entityManager.remove(customer);}

提示删除失败:

再次修改,将多一端的对应的数据也删除后,再次尝试删除:

    @Testpublic void testRemove() {Order order = entityManager.find(Order.class, 2);entityManager.remove(order);Customer customer = entityManager.find(Customer.class, 3);entityManager.remove(customer);}

此时提示删除成功。

JPA(五):映射关联关系------映射单向多对一的关联关系相关推荐

  1. JPA中实现单向多对一的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  2. JPA中实现双向多对多的关联关系(附代码下载)

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  3. JPA中实现单向一对多的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  4. JPA(七):映射关联关系------映射双向多对一的关联关系

    映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone;import java.util.Date; import java.u ...

  5. (转)Hibernate框架基础——多对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...

  6. ssh备考-02多表关联关系映射(一对一、一对多、多对多如何配置)

    01搭建hibernate框架 02多表关联关系映射 03hibernate各种查询方式 目录 一.搭建环境 二.javabean和xml的基础配置 三.测试多表之间的关联配置效果 一对多级联保存: ...

  7. Hibernate - 单向一对多关联关系映射

    上篇博文描述了Hibernate - 单向多对一关联关系映射,本篇博文继续学习单向一对多关系映射. 这里Customer:Order= 1:N,外键保存在Order表中. [1]修改Customer和 ...

  8. mybatis之关联关系映射(一对多和多对多关系)

    今日目标: 一对多关联关系 多对多关联关系 本篇博客是在前四篇的基础上在进行进一步开发的 (四) mybatis集成ehcache&&mybatis集成redis_m0_5852594 ...

  9. Hibernate 实体关联关系映射----总结

    http://lavasoft.blog.51cto.com/62575/39398 Hibernate 实体关联关系映射----总结 花了三天的业余时间,终于写完了Hibernate关联关系映射的所 ...

最新文章

  1. CoreAnimation动画
  2. 中小型商业银行的软件安全测试之道
  3. SpringBoot使用RabbitMQ消息队列
  4. Java Process中waitFor()的问题
  5. redis集群 + 哨兵 + zookeeper_技术干货 | Redis的哨兵和集群
  6. kubernetes安装Helm
  7. Codeforces Round #470 Div. 1
  8. 解决Kscope中文乱码问题
  9. js 基础 -- 循环、函数调用 、全局和局部变量、异常捕获、事件
  10. Playing with OS(操作系统)
  11. modbus通讯失败_你以为你真的了解Modbus 通信协议?
  12. 使用reaver命令穷举PIN码破解WPA2-PSK加密的无线网络
  13. 在办公室谈论工资话题的技巧
  14. Python学习_2015年12月14日
  15. 华为云对象存储OBS,助力企业降本增效
  16. 通读Docs - 《OPL1000 自学整理教程》
  17. git 小乌龟安装教程
  18. 我的无影云电脑初体验
  19. 1047: 阿姆斯特朗数
  20. get请求在ie浏览器中缓存问题

热门文章

  1. IOS和Android测试分别有什么侧重点?
  2. Jmeter使用时部分配置记录
  3. java trunc函数_TRUNC函数的用法
  4. python安装第三方扩展包_Python之安装第三方扩展库
  5. 数据库java_(六) Java数据库
  6. 无所不能java人_无所不能的java
  7. Robust Quasistatic Finite Elements and Flesh Simulation
  8. Dropout与过拟合抑制
  9. indigo中用roslaunch启动RViz观察机器人模型
  10. 邮箱服务器退回,发出去的邮件为什么被退回?