注解@OneToMany@ManyToOne和@ManyToMany的使用总结

0 背景

       项目中用到@OneToMany、@ManyToOne和@ManyToMany,以评论和回复为例(一个评论会有多条回复),按照映射策略,分为外键关联、表关联和默认关联。总结它们的使用方法如下:

1 外键关联

@OneToMany

@Entity
public class Comment{

    private String id;

    @OneToMany( mappedBy="comment", cascade = {CascadeType.REMOVE})   //mappedBy表示双向关系;cascade删除评论时级联删除回复
    @OrderBy( value="CREATED_DATE asc" )        //按创建日期升序查询
    private List<Reply> replyList = new ArrayList<>();
}

@ManyToOne

@Entity
public class Reply{

    private String id;

    @ManyToOne( fetch = FetchType.EAGER )       //关联取数据,eager表示立即加载; lazy表示懒加载,在对性能要求不高时使用
    @JoinColumn( name="COMMENT_ID", referencedColumnName= "ID")
    private Comment comment;
}

当fetch = FetchType.LAZY时,LAZY阻挡了除ID以外的所有访问,解决的办法有: 
1) 通过ID从数据库重新拿一次需要的数据;
2) 将FetchType.LAZY改成 EAGER ,不适用快速查询

2 表关联

@OneToMany

@Entity
public class CustomerEO implements java.io.Serializable {
  ...
  @OneToMany(cascade = { CascadeType.ALL })  
  @JoinTable(name="ref_customer_address",
           joinColumns={ @JoinColumn(name="customer_id",referencedColumnName="id")},
           inverseJoinColumns={@JoinColumn(name="address_id",referencedColumnName="id")})
  private Collection<AddressEO> addresses = new ArrayList<AddressEO>();
  ...
}

 

3 默认关联

这种情况下,只需在CustomerEO中标注@OneToMany即可

create table customer_address (
  customer_id int(20) not null,
  address_id int(20) not null unique
)
alter table customer_address add constraint fk_ref_customer foreign key (customer_id) references customer (id);
 
alter table customer_address add constraint fk_ref_address foreign key (address_id) references address (id);

注意:@ManyToMany和@OneToMany使用方法类似

综上,属性为一对多关系时,用映射策略--外键关联。属性为多对多关系时,用映射策略--表关联!

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值