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();
        B b = new B();
        b.setA(a);
        em. persist(b);

你可能感兴趣的:(jpa,null,Class,getter,setter)