比如多个客户对应一个用户
public class Company{
private SysUser sysUser;
}
在add.jsp页面
<s:form action="xxx_save">
<s:hidden name="sysUserId"/>
</s:form>
我当时想的是
save(){
SysUser sysUser = session.get(SysUser.class,Integer.parseInt(userid.trim()));
company.setSysUser(sysUser);
session.save(company);
}
而看别人写的代码
注意保存的时候
save(){
sysUser.setId(Integer.parseInt(userid.trim()));
company.setSysUser(sysUser);
session.save(company);
}
直接把userId set了,就可以了,然后看session.save(company);出现的sql是
Hibernate: insert into c_company (sysUserId, dispensePerson, dispenseDate) values (?, ?, ?)
所以只要知道对象的sysUserId就可以插入了
但是要注意这是
<many-to-one name="sysUser" class="cn.itcast.crm.domain.SysUser" lazy="false">
<column name="ownerUser"></column>
</many-to-one>
多对一,即有sysUserId外键的时候。
而如果是SysUser类中
<class name="SysUser" table="sys_user"> <set name="companies" inverse="true" lazy="false" cascade="all">
<key column="sysUser_id"/>
<one-to-many class="Company"/>
</set>
也是只set companyId,然后存入到sysUser的company的集合里在更新,却不能执行insert语句,因为一对多sys_user表没有company的外键
List<Company> companies = new ArrayList<Company>();
if (companyIdsIntegers!=null && companyIdsIntegers.length!=0) {
for(Integer companyId:companyIdsIntegers){
Company company = new Company();
company.setId(companyId);
companies.add(company);
}
}
Set<Company> companies2 = new HashSet<Company>(companies);
if (sysUsers!=null && sysUsers.size()!=0) {
for(SysUser sysUser:sysUsers){
sysUser.setCompanies(companies2);
}
sysUserService.updateSysUsers(sysUsers);
}
然后List<SysUser> sysUsers = query.list();的时候,
company.getSysUser()的属性是有值的(比如name等等),因为级联查询SysCompany
<class name="cn.itcast.crm.domain.Company" table="c_company">
<many-to-one name="sysUser" class="cn.itcast.crm.domain.SysUser" lazy="false">
<column name="sysUserId"></column>
</many-to-one>
...............其他省略
jdbc底层只看company.sysUser.id,而不看company.sysUser其他的属性来查询sysUser(当然table表c_company里也没其他sysUser的属性作为列存入数据库,只有sysUserId这个外键)