javascript

位置:IT落伍者 >> javascript >> 浏览文章

JSF和Hibernate的比较


发布日期:2022年10月11日
 
JSF和Hibernate的比较

at backing bean:

List list= new ArrayList();

for(int i=;i<;i++){

Object[] obj=new Object[];

User user =new User();

obj[] =user;

Group group =new Group();

obj[]= group;

listadd(obj);

}

at jsp

<t:datatable value=#{xxxBeangetList} var=obj>

<t:column =#{objuserusername}/>

<t:column=#{objgroupgroupname}/>

</t:datatable>

为什么要提到这个呢?是因为hibernate的nativeSQL 可以查询多多个对象数组当你遇到到复杂逻辑需要自己定义sql去连接查询多张表

public List getJobSectionAndOutworkPoByHeaderId(Integer headerId)

{

StringBuffer hql = new StringBuffer(select {j*}{p*} from (select * from est_job_section where header_id=)append(headerId);

hqlappend() j left join est_outwork_po p on jjob_section_id =pjob_section_id);

Query query = getSession()createSQLQuery(hqltoString())addEntity(jEstJobSectionclass)addEntity(pEstOutworkPoclass);

List list = querylist();

return list;

}

上面的这个方法查询出来的对象就是一个对象类型的数组存放在List里面无需转换可以直接在页面上显示

非常之方便

关于hibernate的另外一个属性inverse at mapping file在处理mapping时候的onetomany的时候有时候我们往子表里插入一条记录hibernate会自作多情地帮我们改动数据库里地数据比如说我们从student表里查询一条出来然后往数据库里再插入一条相当于copy一条我们希望这个student地groupid不要发生变化但是假如我们不在主表group里设定inverse地话当我们插入一条新组新学生但是这个学生信息和组信息都是从数据库里copy出来而不是用户在界面上填写的(某项目的特别的需求)这样就会在copy 组的时候没有问题而在copy学生的时候会把源学生的groupid改掉---自动改掉粗略地估计是因为在session of hibernate里有两份reference借助spring地transation的管理机制不能释放所以源数据就被同步掉了

这样的情况下可以通过在主表 Group表里设定一个inverse=true来通知子表不要做任何的变动

<set name=estEstimationHeaders inverse=true lazy=false>

<key>

<column name=est_base_id />

</key>

<onetomany class=comviziaappboEstEstimationHeader />

</set>

               

上一篇:选择JSF不选Struts的十大理由

下一篇:基于Facelets的JSF