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 在有外键的一方配置级联,另一方作为属性填充外键