一对一不用多说.
一对多:
一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();
B b = new B();
b.setA(a);
em.
persist(b);