hibernate的多对多关系中对inverse属性的设置

现有user,role和user-role表,user-role为两表中间的关系表,两表为【多对多关系】

现给role(被动)设置inverse="true"(放弃对关系的维护,即role表放弃对关系表user-role的维护),
当role.getUSERS().add(user1)时不会在关系表user-role中生成记录,
当user1.getRoles().add(role1)时就会在关系表user-role中生成记录。

但是这并不妨碍casecade给user表role表级联更新。

需要注意:
当两端都是inverse= "false"或是default值时,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1-1' for key 'PRIMARY'

当关系的两头都用inverse="true"也是不对的,就会导致任何操作都不触发对关系表的操作。

 

 

 


现有Customer,LinkMan表,为【一对多关系】

public void demo1(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        Customer customer1 = new Customer();
        customer1.setCust_name("孙悟空");
        
        LinkMan linkMan1 = new LinkMan();
        linkMan1.setLkm_name("太上老君");
        
        customer1.getLinkManSet().add(linkMan1);
        
        // 条件在Customer.hbm.xml上的set中配置了cascade="save-update" inverse="true"
        session.save(customer); // 客户会插入到数据库,因为设置了级联sava-update所以联系人linkMan1也会插入到数据库中,但是因为设置了inverse="true"customer表放弃了对外键的维护权(即LinkMan表里面的外键link_cust_id为null)
        
        tx.commit();
    }
    

你可能感兴趣的:(框架)