【转载】JPA之@OneToMany、@ManyToOne、@JoinColumn

顾名思义,@OneToMany、@ManyToOne这两个注解就是处理一对多,多对一的关系

这两个注解是成双成对的,有了@OneToMany,一定会配置一个@ManyToOne

OneToMany设置
设置OneToMany的具体方法如下:

@Entity
public class OrderEntity {

    @Id
    //...
    private String id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parent")
    private List<ListEntity> list = new ArrayList<ListEntity>();

}

具体说明:

cascade 级联操作

CascadeType. PERSIST 级联持久化 ( 保存 ) 操作
    CascadeType. MERGE 级联更新 ( 合并 ) 操作
    CascadeType. REFRESH 级联刷新操作,只会查询获取操作
    CascadeType. REMOVE 级联删除操作
    CascadeType. ALL 级联以上全部操作

fetch 加载类型,默认情况一的方为立即加载,多的一方为延迟加载

FetchType.LAZY 懒加载

FetchType.EAGER 立即加载(缺省值)

mappedBy 关系维护

mappedBy= “parent” 表示在ListEntity类中的 parent 属性来维护关系,这个名称必须和ListEntity中的parent属性名称完全一致才行

OneToMany必须写mappedBy,不然会多生成一张没用的中间表,因为如果没写mappedBy,JPA不知道具体怎样做关联

ManyToOne设置
设置ManyToOne的具体方法如下:

@Entity
public class ListEntity {

    @Id
    // ...
    private String id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id", insertable = false, updatable = false)
    private OrderEntity parent;

    @Column(name = "order_id")
    private String orderId;

}  

具体说明:

fetch=FetchType.LAZY的意思是select的时候懒加载,当加载ListEntity这个对象的时候,会加载他的属性,如id, name,但是不会去加载parent的属性。如果是EAGER,

不仅会加载id,name等属性,而且会加载parent里面的属性。

@JoinColumn与@Column标记一样,是用于注释表中的字段的。它的属性与@Column属性有很多相同之处,例如name属性是用来标识表中所对应的字段的名

称,其它的不再详述。

@JoinColumn与@Column相区别的是:@JoinColumn注释的是保存表与表之间关系的字段,它要标注在实体属性上(相当于外键)。而@Column标注的是表

中不包含表关系的字段。

在这里,@JoinColumn指的是ListEntity(多)表对应OrderEntity(一)表关联字段的名称。即ListEntity中的orderId对应OrderList中的主键Id。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值