Hibernate JPA 关联关系:
使用cascade做级联操作(只有在满足数据库约束时才会生效):
CascadeType.PERSIST:
级联保存,只有调用persist()方法,才会级联保存相应的数据
CascadeType.REFRESH:
级联刷新,当多个用户同时操作一个实体,为了用户取到的数据是实时的,在使用实体中的数据之前就调用一下refresh()方法
CascadeType.MOVE:
级联删除,当调用remove()方法删除实体时会先删除相关联的数据
CascadeType.MERGE:
级联更新,调用merge()方法时会更新实体中的数据
CascadeType.ALL:
包含以上所有级联属性
Hibernate JPA 一对一:
在person端配置关联,只保存person端
//关联身份证
@OneToOne(mappedBy="person", cascade=CascadeType.ALL)
private Card card;
//关联公民
@OneToOne
@JoinColumn(name="person_id")
private Person person;
Person p = new Person();
p.setName("draco"); Card c = new Card();
c.setCardno("001"); p.setCard(c); session.save(p);
Hibernate JPA 一对多:
2.1 没有关联,两端同时保存
//一端:一对多
@OneToMany(mappedBy="customer")
private Set<Order> orders = new HashSet<Order>();
//多端:多对一
@ManyToOne
@JoinColumn(name="custmer_id")
private Customer customer;
Customer c = new Customer();
c.setName("draco"); Order o = new Order();
o.setProductName("apple"); c.getOrders().add(o); session.save(o);
session.save(c);
2.2 在一端配置关联,只保存一端
//一对多
@OneToMany(mappedBy="customer", cascade={CascadeType.PERSIST})
private Set<Order> orders = new HashSet<Order>();
Customer c = new Customer();
c.setName("draco3"); Order o = new Order();
o.setProductName("apple3"); c.getOrders().add(o);
//session.save(c);
session.persist(c);
Hibernate JPA 多对多:
3.1 没有配置关联,两端同时保存
//关联用户
@ManyToMany(mappedBy="roles")
private Set<User> users = new HashSet<User>();
//关联角色
@ManyToMany
@JoinTable(
name = "t_user_role1",
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="role_id")
)
private Set<Role> roles = new HashSet<Role>();
User u = new User();
u.setName("draco"); Role r = new Role();
r.setName("VIP"); u.getRoles().add(r); session.save(u);
session.save(r);
3.2 在user端配置关联,只保存user
@ManyToMany(cascade={CascadeType.ALL})
User u = new User();
u.setName("draco2"); Role r = new Role();
r.setName("VIP2"); u.getRoles().add(r); session.save(u);
Hibernate JPA 小结结(mappedBy | @JoinColumn | cascade):
mappedBy:
1 当关联关系的双方都不配置mappedBy属性,那么双方会互相生成外键,并且执行3条SQL(2条插入SQL,1条额外的维护外键的SQL)
2 没有配置mappedBy属性的一方生成外键
3 mappedBy和@JoinColumn不能配置在同一方(否则以mappedBy为准)
4 只能有一方配置mappedBy
cascade:
1 在哪一方配置级联,就对哪一方进行session操作
2 在哪一方配置级联,就应把另一方作为属性
3 在有外键的一方配置级联,另一方作为属性填充外键