通过在Customer类中添加set集合。也就是有一的一方来维护关联关系。使用注解@OneToMany,然后在Order类中
不用再添加外键,但是结果生成的数据表和单向多对一的表结构是相同的,在Customer表中没有多余的列,但是在
Order表中添加了外键列,区别就在于这个外键列的增删改查的维护是由一的一方来维护的。
Customer.java
@Table(name="JPA_CUSTOMER") @Entity public class Customer { private Integer id; private String lastName; private String email; private int age; private Date creatTime; private Date brith; private Set<Order> orders = new HashSet<Order>(); @GeneratedValue(strategy =GenerationType.AUTO) @Id public Integer getId() { return id; } public void setId(Integer 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.TIME) public Date getCreatTime() { return creatTime; } public void setCreatTime(Date creatTime) { this.creatTime = creatTime; } @Temporal(TemporalType.DATE) public Date getBrith() { return brith; } public void setBrith(Date brith) { this.brith = brith; } /** * 映射单向一对多的关联关系 * @OneToMany:映射一的一方 * @JoinColumn:映射外键,name属性指定外键的名称。 * 可以使用 @OneToMany 的 fetch 属性来修改默认的加载策略 * 可以通过 @OneToMany 的 cascade 属性来修改默认的删除策略. */ @JoinColumn(name="CUSTOMER_ID") @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE}) public Set<Order> getOrders() { return orders; } public void setOrders(Set<Order> orders) { this.orders = orders; } @Override public String toString() { return "Customer [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age + ", creatTime=" + creatTime + ", brith=" + brith + "]"; } }增删改查
/** * 单向 1-n 关联关系执行保存时, 一定会多出 UPDATE 语句. * 因为 n 的一端在插入时不会同时插入外键列. */ @Test public void testOneToManyPersist() { Customer customer = new Customer(); customer.setAge(16); customer.setBrith(new Date()); customer.setCreatTime(new Date()); customer.setEmail("mm@com"); customer.setLastName("mm"); Order order1 = new Order(); order1.setOrderName("O-mm-1"); Order order2 = new Order(); order2.setOrderName("O-mm-2"); //设置关联关系 customer.getOrders().add(order1); customer.getOrders().add(order2); entityManager.persist(customer); entityManager.persist(order1); entityManager.persist(order2); } /** * 默认对关联的多的一方使用懒加载的加载策略. * 可以使用 @OneToMany 的 fetch 属性来修改默认的加载策略 */ @Test public void testOneToManyFind() { Customer customer = entityManager.find(Customer.class, 9); System.out.println(customer.getLastName()); System.out.println(customer.getOrders().size()); } /** * 默认情况下, 若删除 1 的一端, 则会先把关联的 n 的一端的外键置空, 然后进行删除. * 可以通过 @OneToMany 的 cascade 属性来修改默认的删除策略.实现级联删除。 */ @Test public void testOneToManyRemove(){ Customer customer = entityManager.find(Customer.class, 8); entityManager.remove(customer); }