JPA笔记2 OneToMany
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的更多相关文章
- Jpa中设置OneToMany插入报异常解决办法
在Jpa中如果设置@OneToMany,但使用的时候,如果没有赋值,会报异常出现,这时只需要实例化一个空数组即可, 但类型一定要对应: 实例如下: newField.setxxxxxList(new ...
- Jpa 笔记
ORM 思想 对象关系映射, 建立实体类和表的关系映射关系, 实体类和表中字段的映射关系,我们操作实体类底层是操作数据表, 进而自动的拼接出SQL语句 Jpa规范 Jpa(Java Persisten ...
- Spring Data JPA笔记
1. Spring Data JPA是什么 Spring Data JPA是Spring Data大家族中的一员,它对对持久层做了简化,用户只需要声明方法的接口,不需要实现该接口,Spring Dat ...
- JPA笔记4 ManyToMany
package many_to_many; import java.util.HashSet; import java.util.Set; import javax.persistence.Entit ...
- JPA笔记3 OneToOne
package one_to_one; import javax.persistence.Entity; import javax.persistence.FetchType; import java ...
- JPA笔记1 ManyToOne
persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence ver ...
- 记: Spring Data Jpa @OneToMany 级联查询被动触发的问题
I have encountered a bug in using Spring Data Jpa. Specifically,when @OneToMany was used to maintain ...
- jpa
学习尚硅谷jpa笔记: 所依赖的jar包: 首先在META-INF下创建配置文件,persistence.xml <?xml version="1.0" encoding=& ...
- [转]Hibernate与Jpa的关系,终于弄懂
原文地址:http://blog.sina.com.cn/s/blog_5f1619e80100yoxz.html 我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate, ...
随机推荐
- MES论坛
MES是智能制造的核心系统,是实现中国制造2025的关键应用系统.MES应用于车间执行层,中文为制造执行系统. 目前MES交流社区比较少,已有的都显得比较杂乱,所以新开了一个MES论坛地址为https ...
- Python正则表达式中re.S作用
re.S的作用: 不使用re.S时,则只在每一行内进行匹配,如果存在一行没有,就换下一行重新开始,使用re.S参数以后,正则表达式会将这个字符串看做整体,在整体中进行匹配 对比输出结果: import ...
- 5. Vue - 小清单实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
解决方法 在QT工程的.pro文件中添加如下内容: LIBS=-ldl
- Redis学习笔记(八、缓存设计)
目录: 缓存更新策略 缓存粒度 缓存穿透 缓存雪崩 缓存击穿 缓存更新策略: 1.内存溢出淘汰策略 当redis的使用内存超过maxmemory时会触发相应的策略,具体策略由maxmemory-pol ...
- LINUX下查看点云图————point cloud(.ply .vtk .pcd)
首先,你要确定点云的格式:.pcd(.vtk) 还是 .ply 如果是.pcd(.vtk),那么可以用pcl工具查看: 1.安装pcl,官网链接点击打开链接 sudo add-apt-reposito ...
- 玩转算法系列--图论精讲 面试升职必备(Java版)
第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真 ...
- xargs 用法理解
原来一直不理解,linux shell下 xargs和 管道的区别: 1.管道在linux shell用得比较广泛,管道常常用来组合两个及以上的命令,共同完成一个功能: 比如:我们要统计某一个文件有多 ...
- Linux学习笔记-第10天 特殊的交换分区
关键词,分区.mkswap swapon .uquota,RAID,/etc/fstab 此章开始,难度有些提升.不过还好自己有点基础.
- windows下 go vscode编译运行方法
1:直接在终端运行go run命令编译 2.安装code runner插件,根据箭头标示顺序,可以在右侧看到它支持的语言.