JPA:双向多对一

è¿éåå¾çæè¿°

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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值