package one_to_many;

import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
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; @Table(name = "JPA_CUSTOMERS")
@Entity
public class Customer2 { @Override
public String toString() {
return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + ", cla=" + cla + ", ff=" + ff + "]";
} private Integer id;
private String lastName;
private String email;
private int age;
private int cla;
private String ff;
private Set<Order2> orders = new HashSet<>(); @GeneratedValue(strategy = GenerationType.AUTO)
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} 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;
} public int getCla() {
return cla;
} public void setCla(int cla) {
this.cla = cla;
} public String getFf() {
return ff;
} public void setFf(String ff) {
this.ff = ff;
} // 删除1的一端,默认会先修改多的一端,然后再删除1的一端
// 可以通过修改@OneToMany的cascade属性来修改默认的删除策略
@JoinColumn(name = "customer_id")
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.REMOVE })
public Set<Order2> getOrders() {
return orders;
} public void setOrders(Set<Order2> orders) {
this.orders = orders;
}
}
package one_to_many;

import javax.persistence.Column;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table; @Table(name = "JPA_ORDER")
@Entity
public class Order2 { private Integer id;
private String orderName; // private Customer customer; @GeneratedValue(strategy = GenerationType.AUTO)
@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;
} // //映射单向n-1的关联关系
// @JoinColumn(name = "customer_id")//, foreignKey =
// @ForeignKey(ConstraintMode.NO_CONSTRAINT))
// @ManyToOne(fetch=FetchType.LAZY)
// public Customer getCustomer() {
// return customer;
// }
//
// public void setCustomer(Customer customer) {
// this.customer = customer;
// } @Override
public String toString() {
return "Order [id=" + id + ", orderName=" + orderName + "]";
} }
package one_to_many;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence; public class Main2 { public static void main(String[] args) {
// TODO Auto-generated method stub String persistenceUnitName = "jpa-1";
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName); EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction transaction = entityManager.getTransaction();
transaction.begin(); // oneToManyPersist(entityManager);
// oneToManyRemove(entityManager);
oneToManyUpdate(entityManager); transaction.commit();
entityManager.close();
entityManagerFactory.close();
} // 1.单向1-n关联关系执行保存时,一定会多出update语句
// 因为n的一端在插入时不会同时插入外键
private static void oneToManyPersist(EntityManager entityManager) {
Customer2 customer = new Customer2();
customer.setEmail("fs2@ss.com");
customer.setLastName("123");
customer.setAge(23);
customer.setCla(33);
customer.setFf("aa"); Order2 order2 = new Order2();
order2.setOrderName("1"); Order2 order3 = new Order2();
order3.setOrderName("2"); customer.getOrders().add(order2);
customer.getOrders().add(order3); entityManager.persist(order2);
entityManager.persist(order3);
entityManager.persist(customer); } // 默认对关联的多的一方做懒加载
private static void oneToManyFind(EntityManager entityManager) {
Customer2 customer2 = entityManager.find(Customer2.class, 5);
System.out.println(customer2);
System.out.println(customer2.getOrders().size());
} // 删除1的一端,默认会先修改多的一端,然后再删除1的一端
// 可以通过修改@OneToMany的cascade属性来修改默认的删除策略
private static void oneToManyRemove(EntityManager entityManager) {
Customer2 customer2 = entityManager.find(Customer2.class, 5);
entityManager.remove(customer2);
} private static void oneToManyUpdate(EntityManager entityManager) {
Customer2 customer2 = entityManager.find(Customer2.class, 6); customer2.getOrders().iterator().next().setOrderName("xx");
}
}

JPA笔记2 OneToMany的更多相关文章

  1. Jpa中设置OneToMany插入报异常解决办法

    在Jpa中如果设置@OneToMany,但使用的时候,如果没有赋值,会报异常出现,这时只需要实例化一个空数组即可, 但类型一定要对应: 实例如下: newField.setxxxxxList(new ...

  2. Jpa 笔记

    ORM 思想 对象关系映射, 建立实体类和表的关系映射关系, 实体类和表中字段的映射关系,我们操作实体类底层是操作数据表, 进而自动的拼接出SQL语句 Jpa规范 Jpa(Java Persisten ...

  3. Spring Data JPA笔记

    1. Spring Data JPA是什么 Spring Data JPA是Spring Data大家族中的一员,它对对持久层做了简化,用户只需要声明方法的接口,不需要实现该接口,Spring Dat ...

  4. JPA笔记4 ManyToMany

    package many_to_many; import java.util.HashSet; import java.util.Set; import javax.persistence.Entit ...

  5. JPA笔记3 OneToOne

    package one_to_one; import javax.persistence.Entity; import javax.persistence.FetchType; import java ...

  6. JPA笔记1 ManyToOne

    persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence ver ...

  7. 记: Spring Data Jpa @OneToMany 级联查询被动触发的问题

    I have encountered a bug in using Spring Data Jpa. Specifically,when @OneToMany was used to maintain ...

  8. jpa

    学习尚硅谷jpa笔记: 所依赖的jar包: 首先在META-INF下创建配置文件,persistence.xml <?xml version="1.0" encoding=& ...

  9. [转]Hibernate与Jpa的关系,终于弄懂

    原文地址:http://blog.sina.com.cn/s/blog_5f1619e80100yoxz.html 我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate, ...

随机推荐

  1. iOS 国际本地化(对新项目集成和已有项目集成)

    第一推荐一篇金先生的博客,受益非浅,在这里真诚的感谢 https://www.jianshu.com/p/7cb0fad6d06f金小白 首先金小白先生把两种方式都做了介绍,第一种我就不在过多详细的讲 ...

  2. dos编码格式 cmd编码 dos中文显示

    设置uft-8编码 > chcp 65001 设置默认编码 > chcp 936 字符集 1258 越南语 1257 波罗的语 1256 阿拉伯语 1255 希伯来语 1254 土耳其语 ...

  3. CodeForces 1236D(模拟)

    题意 https://vjudge.net/problem/CodeForces-1236D 最近,爱丽丝得到了一个新玩偶.它甚至可以走路! 爱丽丝为玩偶建造了一个迷宫,并想对其进行测试.迷宫具有n行 ...

  4. MATLAB高斯混合数据的生成

    MATLAB高斯混合数据的生成 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 高斯混合模型的基本原理:聚类——GMM,MATLAB中GMM聚类算法:M ...

  5. c# 第22节 c#四大方法 静态方法、实例方法、虚方法、重新方法

    本节内容: 1:静态方法和实例方法什么 2:虚方法是什么 3:重写方法 4:禁止重写方法 1:静态方法和实例方法是什么 静态方法,一般是类的常用方法,允许在不创建类的实例的情况下,直接调用. 静态方法 ...

  6. django获取某一个字段的列表 values values_list flat=true

    1.values() print(Question.objects.values('title')) #得到的是一个字典 <QuestionQuerySet [{'title': '查询优化之s ...

  7. 基于 lstm 的股票收盘价预测 -- python

    开始导入 MinMaxScaler 时会报错 “from . import _arpack ImportError: DLL load failed: 找不到指定的程序.” (把sklearn更新下) ...

  8. C++ 标准库 std::remove

    参见:https://zh.cppreference.com/w/cpp/algorithm/remove std::remove 不会改变输入vector / string 的长度.其过程,相当于去 ...

  9. python-文件操作&模块&面向对象

    python 文件处理 li = [[']] for i in li: print(','.join(i)) # join字符串拼接 语文,数学,英语 100,122,123 从原文件末尾开始写入 # ...

  10. go 基本语法

    ====type==== import ( "fmt" ) func main() { type bigint byte //定义类型 var a bigint fmt.Print ...