单向一对多:
单向1-n关联关系保存时候一定会多出update语句,因为n的一段插入时候不会同时插入外键列。
默认对关联的多的一方使用懒加载策略,可以使用@OneToMany的fetch属性改变默认的加载策略。
默认情况,若删除1的一段,则会先将关联的n的一方的外键置未空,然后执行删除,可以通过@OneToMany的cascade属性设置级联删除。cascade={cAScadeType.REMOVE}
修改可以
多的一方:
@Table(name="JPA_ORDER")
@Entity
public class Order {
@Id
@GeneratedValue
private Integer id;
@Column(name="ORDER_NAME")
private String orderName;
一的一方
@Table(name="JPA_CUSTOMER")
@Entity
public class Customer {
@Id
@GeneratedValue
private Integer id;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name="EMAIL")
private String email;
@Column(name="age")
private Integer age;
@DateTimeFormat
@Column(name = "CREATE_TIME")
private Date createTime;
@DateTimeFormat
@Column(name="BIRTH")
private Date birth;
//映射单向1-n关联关系
//使用@OneToMany来映射关联关系,@JoinComunm映射外键列的名称
@JoinColumn(name="CUSTOMER_ID")
@OneToMany
private Set<Order> orders;
新增:
单向1对多关联关系保存一定会多出update语句,因为多的一方插入数据不会同时插入外键列
Customer customer = new Customer();
customer.setAge(18);
customer.setBirth(new Date());
customer.setCreatedTime(new Date());
customer.setLastName("ZZ");
Order order1 = new Order();
order1.setOrderName(""O-ZZ-1);
Order order2 = new Order();
order2.setOrderName(""O-ZZ-2);
建立关联关系
customer.getOrders().add(order1);
customer.getOrders().add(order2);
保存
entityMagager.persist(order1);
entityMagager.persist(order2);
entityMagager.persist(consumer);
*************************************************
查询
默认使用懒加载加载多的一方策略
Customer customer = entityMagager.find(Customer.class,1);
System.out.println(customer.getLastName());
System.out.println(customer.getOrders().size());
**************************************************
修改
Customer customer = entityMagager.find(Customer.class,1);
customer.getOrders().iterator().next().setOrderName("OOOOOOOOO");
***************************************************
删除
默认情况若删除一的一方,会把关联的多的一端外键置空,然后删除一的。
可以使用@OneToMany的cascade属性来修改默认的删除策略。
若删除多的一方可以直接删除,因为外键在多的一方。
Customer customer = entityMagager.find(Customer.class,1);
entityManager.remove(customer);