Hibernate JPA 关联关系

Posted 耍流氓的兔兔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate JPA 关联关系相关的知识,希望对你有一定的参考价值。

 

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 关联关系的主要内容,如果未能解决你的问题,请参考以下文章

JPA+Hibernate - 实体关系中的循环 - 级联策略

JPA与hibernate-------JPA

JPA与hibernate-------JPA

Sprng Data JPA与hibernate的关系

Spring Data Jpa系列教程--------实体解析和关联关系

JPA 不生成外键