hibernate 映射自身一对多双相关联,在model中,含有类对象,那在action中,怎样得到前台页面表单的值呢?
public class Organization {
private int id;
private String name;
private String sn;
private String description;
private Organization parent;
private Set<Organization> children;
。。。。。。。
}
在hibernate的映射关系:
<class name="com.oa.model.Organization" table="t_organization">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="sn"/>
<property name="description"/>
<many-to-one name="parent" column="pid"></many-to-one>
<set name="children" lazy="extra" inverse="true">
<key column="pid"></key>
<one-to-many class="com.oa.model.Organization"/>
</set>
</class>
那我在action 中,怎样得到前提的值呢?因为model中用的是对象perent (children),数据库生成的字段是pid,而model中没有这个pid属性,是不是必须使用request来得到前台值??
望高手答疑解惑!!!!!! 展开
PID是数据库生成的用于维护关联关系的外键列的列名,使用request如何从前台得到!从上面的配置看,设置inverse=“true”表明children表(为了后面好叙述,将该表的对象的类称为Children类)是从表,即由该端控制关联关系,parent表是主表(为了后面好叙述,将该表的对象的类称为Parent类),不控制关联关系。持久化该对象需要注意两点:
1、在保存数据时,应最先持久化主表即Parent对象(或该对象本身已经处于持久化状态)。因为我们希望程序持久化Children对象时,Hibernate可为children的外键属性分配值。也就是说在向children表插入记录时,该记录的外键列已制定了值——这表明它参照的主表记录已存在。
2、先设置Parent对象和Children对象的关联关系,再保存持久化Children对象。
所以根据上面配置,你可以这样保存对象:
Organization org1=new Organization();
org1.setName("aaaa");
org1.setSn("bbbbb");
org1.setDescription("ccccccc");
//持久化该对像
session.save(org1);
//创建一个瞬态Organization对象,令这个对象等于org1
Organization org2=org1;
//设置关联关系
org2.setParent(org1);
//再持久化org2对象
session.persist(org2);
我用oracle10g测试了上面的代码,表结构为
如果我在前台添加机构的时候,肯定会要求选择父机构,但是在后台取得数据的时候是用get()得到前台提交的数据:id ,name,sn ,description ,和父机构的id,但是在在Organization 类中是没有父机构id这个属性的,那这个id怎么得到,用request?
父机构的ID就是表的ID,前台选择的父机构是从数据库表中查询出来输出到前台的。后台接收到前台数据将父ID解析出来,剩余的变量赋值给children对象。然后根据接收到的父ID从数据库中查询出parent对象,然后再设置关联关系(childern.setParent())。如果闲麻烦直接用SQL语句插入数据。