配置:

<?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" transaction-type="RESOURCE_LOCAL">
<!-- 配置用什么orm 产品作为jpa的实现 -->
<!-- 1.实际上配置的是 javax.persistence.spi.PersistenceProvider接口的实现类 2.若只有一个jpa的实现,也可以比配置该节点
-->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- 添加持久化类 -->
<class>entity.Customer</class>
<class>entity.Order</class> <properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="manager123" /> <!-- 配置jpa的实现产品的基本属性,配置hibernate的基本属性 -->
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>

entity  customer

package entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; 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.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType; import org.eclipse.persistence.jpa.config.Cascade; @Table(name = "customer")
@Entity
public class Customer { private int id;
private String lastName;
private String email;
private int age; private Date birthday;
private Date creatTime; /******** 一对多关系, 一个顾客,有多个订单 ********/
Set<Order> orders = new HashSet<Order>(); @JoinColumn(name = "CUSTOMER_ID") // 用来映射外键列的名称
//cascade={CascadeType.REMOVE} 设置级联删除
//mappedBy="customer" 设置谁来维护关系爱 (在此设置多的 customer维护,及Customer不维护,有order维护)
//!!!使用mappedBy="XX“属性,@JoinColumn(name="XXXX")不用指定(否则会报错)
@OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE},mappedBy="customer") // 映射一对多的关系
public Set<Order> getOrders() {
return orders;
} public void setOrders(Set<Order> orders) {
this.orders = orders;
} /*************** 使用table生成主键的策略 *******************************/
// @TableGenerator(name="ID_GENARATER",
// table="jpa_id_generators",
// pkColumnName="PK_NAME", //指定主键键的列
// pkColumnValue="CUSTOMER_ID", //指定主键的行(列的哪一行)
// valueColumnName="PK_VALUE", //指定主键值的列
// allocationSize=100) //主键增加的大小,默认为50
// @GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENARATER")
// //generator与@TableGenerator的name对应
/************************************/
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} @Column(name = "last_name")
public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Temporal(TemporalType.DATE)
public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Temporal(TemporalType.TIMESTAMP)
public Date getCreatTime() {
return creatTime;
} public void setCreatTime(Date creatTime) {
this.creatTime = creatTime;
} @Override
public String toString() {
return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + ", birthday="
+ birthday + ", creatTime=" + creatTime + "]";
} }

Order

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table; @Table(name="JPA_ORDERS")
@Entity
public class Order { private Integer id;
private String orderName; // private Customer customer; //暂时注掉。测试一对多 @GeneratedValue
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Column(name="ORDER_NAME")
public String getOrderName() {
return orderName;
} public void setOrderName(String orderName) {
this.orderName = orderName;
} /**
* @JoinColumn //映射外键
* @ManyToOne //映射一对多的关系
* ***/
// @JoinColumn(name="CUSTOMER_ID")
// @ManyToOne(fetch=FetchType.LAZY)
// public Customer getCustomer() {
// return customer;
// }
//
// public void setCustomer(Customer customer) {
// this.customer = customer;
// } }

manyToOneTest

package test;

import java.util.Date;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence; import org.junit.After;
import org.junit.Before;
import org.junit.Test; import entity.Customer;
import entity.Order; public class japManyToOneTest { private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;
private EntityTransaction entityTransaction; @Before
public void init() {
entityManagerFactory = Persistence.createEntityManagerFactory("JPA");
entityManager = entityManagerFactory.createEntityManager();
entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
} @After
public void distory() {
entityTransaction.commit();
entityManager.close();
entityManagerFactory.close(); }
/* (多对一测试,由于测试一对一多,把Order中的Customer注释了)
@Test
public void testManyToOneUpdate() {
Order order = entityManager.find(Order.class, 6);
order.getCustomer().setLastName("MM");
} //* 不能删除1的一方,由于有外键关联 @Test
public void testManyToOneDelete() {
Order order = entityManager.find(Order.class, 5);
entityManager.remove(order);
// Customer customer = entityManager.find(Customer.class, 4);
// entityManager.remove(customer); } //* default user left out select we cen user the parameter of fecth="lazy"
// * at @manytoOne(fecth="lazy")
@Test
public void testManyToOneFind() {
Order order = entityManager.find(Order.class, 5);
System.out.println(order); System.out.println(order.getCustomer().getLastName());
} // * 对于多对一,建议先保存1的一端,然后保存多的一端。 (这样就不会多出额外的update语句) 及让多的一方维护关系 @Test
public void ManyToOnePersistence() {
Customer customer = new Customer();
customer.setAge(23);
customer.setEmail("qq@163.com");
customer.setLastName("QQ");
customer.setBirthday(new Date());
customer.setCreatTime(new Date()); Order order1 = new Order();
order1.setOrderName("OO_order_01"); Order order2 = new Order();
order2.setOrderName("OO_order_02"); // 设置关联关系
order1.setCustomer(customer);
order2.setCustomer(customer); // 保存
entityManager.persist(customer);
entityManager.persist(order1);
entityManager.persist(order2); }
*/
}

oneToManyTest

package test;

import static org.junit.Assert.*;

import java.util.Date;
import java.util.Set; import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence; import org.junit.After;
import org.junit.Before;
import org.junit.Test; import entity.Customer;
import entity.Order; public class japOneToManyTest { private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;
private EntityTransaction entityTransaction; @Before
public void init() {
entityManagerFactory = Persistence.createEntityManagerFactory("JPA");
entityManager = entityManagerFactory.createEntityManager();
entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
}
@After
public void distory() {
entityTransaction.commit();
entityManager.close();
entityManagerFactory.close(); } @Test
public void testOneToMany(){
Customer customer = entityManager.find(Customer.class, 15) ;
Set<Order> orders = customer.getOrders();
Order order = orders.iterator().next();
order.setOrderName("AAAAAAAAAAAAAAAA");
//System.out.println(order);
}
/**
* 一对多,默认删除一的一方,多的一方外键会置空,一的一方会被删除,多的一方保留,外键置空
* 可以通过级联删除一并删除(在@onetomany(cascade={CascadeType.REMOVE}))
*/
@Test
public void testOneToManyDelete(){
Customer customer = entityManager.find(Customer.class, 12);
entityManager.remove(customer); } /**
* default staregt is lazy 默认关联多的一方使用lazy加载策略
* @throws Exception
*/
@Test
public void testOneToManyFind() throws Exception {
Customer customer = entityManager.find(Customer.class, 2);
System.out.println(customer.getLastName()); //获取一对多的多。 default staregt is lazy
System.out.println(customer.getOrders().size()); } /**
* 对于一对多, 保存时,无论是先保存一的一端,还是多的一端都会执行update语句
* 因为多的一端 ,在保存时不会同时插入外键列
*/
@Test
public void testOneToManyPersistence(){
Customer customer = new Customer();
customer.setAge(23);
customer.setEmail("KKKK@163.com");
customer.setLastName("KKKK");
customer.setBirthday(new Date());
customer.setCreatTime(new Date()); Order order1 = new Order();
order1.setOrderName("DDDD_01");
Order order2 = new Order();
order2.setOrderName("DDDD_02"); //建立关系
customer.getOrders().add(order1);
customer.getOrders().add(order2);
//执行保存
entityManager.persist(customer);
entityManager.persist(order1);
entityManager.persist(order2); } }

jpa 一对多and 多对一的更多相关文章

  1. JPA一对多和多对一关系

    1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录. 维护端注解 @OneToMany(cascade = { CascadeType.PERSIST, Ca ...

  2. JPA 一对多、多对一注解

    1. @OneToMany @OneToMany 是属性或方法级别的注解,用于定义源实体与目标实体是一对多的关系. 参数 类型 描述 targetEntity Class 源实体关联的目标实体类型,默 ...

  3. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

  4. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  5. PringData JPA一对多多对一多对多关联

    一.一对多.多对一 1.Country实体类 2.City实体类 3.CountryDao层 4.CityDao层 5.Controller package com.zn.controller; im ...

  6. SpringData JPA一对多多对一多对多关联

    一.一对多.多对一 1.Country实体类 2.City实体类 3.CountryDao层 4.CityDao层 5.Controller package com.zn.controller; im ...

  7. Hibernate框架--关联映射,一对多,多对多 inverse cascade

    回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...

  8. 07-hibernate注解-一对多(多对一)双向外键关联

    一对多(多对一)双向外键 多方:多方持有一方的引用. @ManyToOne(cascade={CasCadeType.ALL},fetch=FetchType.EAGER) @JoinColumn(n ...

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

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

随机推荐

  1. Windows10 解决“装了 .NET Framework 4.5.2/4.6.1/4.7.1等等任何版本 或版本更高的更新”问题

    ========================================================= 系统自带的.net framework版本为4.7,自己安装.NET Framewo ...

  2. eclipse/idea批量替换空白行

    批量替换空行Ctrl+F 快捷方式打开Find/Replace工具窗选择Regular expression(idea是regex)项,允许查询匹配正则表达式在Find文本框输入正则表达式:^\s*\ ...

  3. LG1955 [NOI2015]程序自动分析

    题意 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠x ...

  4. systemd学习笔记

    一.systemd介绍 systemd即为system daemon,是linux下的一种init软件与多数发行版使用的System V风格init相比,systemd采用了以下新技术: (1) 采用 ...

  5. C#:消息队列应用程序

    Carl NolanMicrosoft Corporation 摘要:本文概述一种用于处理若干消息队列的 Windows 服务解决方案,重点介绍 .NET 框架和 C# 应用程序. 下载 CSharp ...

  6. 写了一篇关于 FastAdmin 插件路由的分析文章

    写了一篇关于 FastAdmin 插件路由的分析文章 插件路由演示 ThinkPHP 的路由就像是整个应用的调度室,让你的应用 url 更友好,而且让应用更安全,不会让真实的地址暴露出去. 了解过 L ...

  7. c# list排序的三种实现方式 (转帖)

    用了一段时间的gridview,对gridview实现的排序功能比较好奇,而且利用C#自带的排序方法只能对某一个字段进行排序,今天demo了一下,总结了三种对list排序的方法,并实现动态传递字段名对 ...

  8. 【Reporting Services 报表开发】— 如何设置报表分页列标题每一页都显示

    一.打开已经开发好的报表ReportTest,选择列组下的高级模式—>选择行组的静态(会关联列标题订单编号),修改下面的属性: 1.Hidden:False 2.FixedData:True 3 ...

  9. DOM操作之属性和样式操作

    在DOM操作,除了前面的节点操作以外,常常被用到的操作还有属性操作和节点操作,下面,主要来总结一下jQuery中的属性操作方法和样式操作方法. 在开始操作前,我们需要先在html中添加如下代码,后面所 ...

  10. Date类型之组件方法

    在之前总结了Date类型的继承方法和格式化方法,现在来总结一下日期时间组件方法,这些方法都是直接取得和设置日期值中特定部分的方法. var d = new Date(); //getDate() 从 ...