hibernate一对多哪一方放弃权利?

如果一的一方inverse=false,多得一方inverse=true,即一的一方没有放弃维护一对多关系的权利,多的一方放弃了,即,如果(假设x为一的一方对象,y为多的一方对象),x中有y的集合set<y>,然后集合里面每个y的对象还带了yid,则save(x)的时候hibernate就会帮我们把那些y

的对应的表的记录yid对应的记录上的外键添上xid以此来维护x、y之间的联系,这个时候,一的一方x来维护关系,如果x被删除了,或者主键变化了,则相对应的y的外键会清空和置为null;

而x那里inverse=true,y那里默认inverse=false,由多的一方来维护关系,即,当y更换关联的对象时,把外键换成另外一个,也不会影响x里面的数据,

所以,我们一般由多的一方来维护一对多的关系,一的一方经常就是inverse=ture

例如:

package com.lxl.bos.service.impl;
import java.util.HashSet;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.lxl.bos.dao.dao.IDecidedzoneDao;
import com.lxl.bos.dao.dao.ISubareaDao;
import com.lxl.bos.domain.Decidedzone;
import com.lxl.bos.domain.Subarea;
import com.lxl.bos.service.IDecidedzoneService;
@Service
@Transactional
public class DecidedzoneServiceImpl implements IDecidedzoneService {
//注入Dao
 @Autowired
 private IDecidedzoneDao decidedzoneDaoImpl;
 private ISubareaDao subareaDaoImpl;
 @Override
 public void save(String[] subareaid,Decidedzone model) {
  // TODO Auto-generated method stub
  //先把一的一方存进数据库
  decidedzoneDaoImpl.save(model);
  for(String subarea:subareaid)
  {
  Subarea subarea2=subareaDaoImpl.findById(subarea);
  //因为这里的一的一方放弃了维护外键关联的权利,所以这里就算是save了,subarea里面的外键也不会改变
  //model.getSubareas().add(subarea2);
  //用多的一方存储一的一方的对象来建立关联关系和外键(此时的subarea2是持久态的,所以hibernate会根据快照机制把外键更新到数据库)
  subarea2.setDecidedzone(model);
  }
  
 }
 
 
}
原文地址:https://www.cnblogs.com/lxl87/p/10810134.html