jpa 实体生命周期有四种状态
New:瞬时对象,尚未有id,还未和Persistence Context建立关联的对象。
Managed:持久化受管对象,有id值,已经和Persistence Context建立了关联的对象。
Datached:游离态离线对象,有id值,但没有和Persistence Context建立关联的对象。
Removed:删除的对象,有id值,尚且和Persistence Context有关联,但是已经准备好从数据库中删除
————————————————
多的一方
@Table(name="JPA_ORDER")
@Entity
public class Order {
@Id
@GeneratedValue
private Integer id;
@Column(name="ORDER_NAME")
private String orderName;
// 如果这里需要定义外键字段,一定需要加上insertable和updateable都为false才可以。
//@Column(name="CUSTOMER_ID",insertable=false,updateable=false)
// private String customerId;
//使用@ManyToOne来映射多对一的关联关系
//使用@JoinColumn来映射外键
@JoinColumn(name="CUSTOMER_ID")
@ManyToOne
private Customer customer;
一的一方
@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映射外键列的名称
//fetch属性修改默认的加载策略
//cascade修改默认的删除策略
//@JoinColumn(name="CUSTOMER_ID")
//mapperBy 使用当前类中orders属性的类中的customer维护关系
@OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE},mapperBy="customer")
private Set<Order> orders;
Customer customer = new Customer();
customer.setAge(18);
custoemr.setBirth(new Date());
customer.setCreatedTime(new Date());
customer.setEmail("mm@163.com");
customer.setLastName("MM");
Order order1 =new Order();
order1.setOrderName("O-YY-1");
Order order2 =new Order();
order2.setOrderName("O-YY-2");
建立关联关系
customer.getOrders().add(order1);
customer.getOrders().add(order2);
order1.setCustomer(customer);
order2.setCustomer(customer);
entityManager.persist(customer);
entityManager.persist(order1);
entityManager.persist(order2);
总结:
若是双向多对一关联关系保存时候,
若先保存多的一方,再保存一的一方,默认会多出2n条update语句
若先保存一的一方,再保存多的一方,默认会多出n条update语句
因此进行双向多对一关联关系时候,建议使用多的一方维护关联关系,而一的一方放弃维护关联关系。这样可以有效减少sql语句。使用mapperBy表示这个注解的类中放弃维护关联关系。
注意:若在一的一方@OneToMany中使用mapperBy属性,则@OneToMany端不能再使用@JoinColumn属性。
//映射单向1-n关联关系
//使用@OneToMany来映射关联关系,@JoinComunm映射外键列的名称
//fetch属性修改默认的加载策略
//cascade修改默认的删除策略
//@JoinColumn(name="CUSTOMER_ID")
//mapperBy 使用当前类中orders属性的类中的customer维护关系
@OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE},mapperBy="customer")
private Set<Order> orders;
// 如果这里需要定义外键字段,一定需要加上insertable和updateable都为false才可以。
//@Column(name="CUSTOMER_ID",insertable=false,updateable=false)
// private String customerId;