JPA中关系印射注意事项

一对一不用多说.
一对多:
一A对多B.单向: (tb_a,tb_b)
代码省略必须的但和主题的内容如@Entity等标记,Setter,Getter等
class A{
private int id;
………………..其它字段
@OneToMany(cascade = CascadeType.ALL)
private List<B> bs = new ArrayList<B>();
}
class B{
private int id;
…………………其它字段
}
只在A这一端加上@OneToMany就行了.B这一端不用任何标记,这时JPA一定要求另外一个辅助表.表名为:tb_a_tb_b即两表用_连结,其中保存两个表的ID关系.字段名称为:
a_id,B在A中引用的字段+”_ID”;即 bs_id; 如果是自动生成表,这个关联表也会自动生成.
在单向一对多时的操作时也是只需单向设置即可,ID对应关系由关联表自动维护:
B b = new B();
//不用b.setId(xxx);
A a = new A();
a.getBs().add(b);
em. persist(a);
A对多B.双向(tb_a,tb_b)
如果不想用中间关联表 , 只能用双向关系 :
class A{
private int id;
………………..其它字段
@OneToMany(cascade = CascadeType.ALL,mappedBy="a")
private List<B> bs = new ArrayList<B>();
}
class B{
private int id;
…………………其它字段
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "a_id")
private A a;
}
此时tb_b中需a_id字段.
操作时需要双向设置,否则a_id为null,关系丢失:
B b = new B();
//其它set.
A a = new A();
b.setA(a);
a.getBs().add(b);
em. persist(a);
这样才能正确保存完整的数据格式
B A.双向(tb_a,tb_b)
当然,你可以从B中利用外健默认单向关联ManyToOne,但这样的单向关系在绝大多数场合没有意义.
如一个班级没有获取学生的集合,却在学生实体中获取班级,虽然可能,但没有多少人不把它做成双向关系的:
这里需要在tb_b中设置a_id为外键关联到tb_a中的id.
class A{
private int id;
………………..其它字
}
class B{
private int id;
…………………其它字段
@ManyToOne(cascade = CascadeType.ALL) //默认多对一,只此一行设置
private A a;
}
而且这里的操作应该是:
A a = new A();
Bb = new B();
b.setA(a);
em. persist(b);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值