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 在有外键的一方配置级联,另一方作为属性填充外键
Hibernate ??JPA ??关联关系
原文地址:http://www.cnblogs.com/roxy/p/7647125.html