以某个实际场景为例,现在两张表:用户表User 订单表Order;很显然用户对订单是一对多的关系。二者注解如下
用户表User
@Entity @Table(name="users") public class User{ private Integer id; private String name; @OneToMany private List<Order> orders; }
订单表Order
@Entity @Table(name="order") public class order{ private Integer id; private String name; @ManyToOne @JoinColumn(name = "userId") private user user; }
以上就完成了两张表之间的外键维护,这种使用场景很常见,此处不再赘述。
下面说一下另外的业务场景,User表和Order使用了很久,后面需要加一个地址表Address,这个表是用户的收货地址,一个用户有多个收货地址,地址表只是单方面依赖用户表,而用户的地址在业务场景中使用的并不是很频繁,而且此时不想修改User表,这个时候,只需要在Address表中加入@ManyToOne就可以,不用对User表做任何修改,如下
@Entity @Table(name="address") public class Address{ private Integer id; private String name; @ManyToOne @JoinColumn(name = "userId") private user user; }
对User表不用做修改,就可以解决问题。
总结:@OneToMany和@ManyToOne是可以分开使用的,不一定非要成对出现。成对使用可以让数据结构更加完整,单独使用的好处是可以轻易扩展原有数据。以上面的例子为例,假如Address表后期不在使用,删除之后也不会对User表造成任何影响。但是Order表却不能轻易删除,删除时会出现外键约束问题。这个就是单独使用@ManyToOne的好处。
单独使用@ManyToOne时也会出现一些问题,在做级联操作时会出现问题。