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"); } }