hibernate 一对多

来源:互联网 发布:淘宝房地产拍卖网 编辑:程序博客网 时间:2024/05/12 17:16

想做级联操作,则1.需要写cascade属性   2.在操作方法中必须要有两个表相关的体现

1.一对多

table 多的的那方要有1的那方的主键,,如1:1province中有pid,pname,,多:city中有cid,cname,pid;

在表对应的类时,1的那方除了pid,pname,外还有Set  citylist=new HashSet();和set/get方法

    多的那方只要cid,cname和对应setget方法,没有pid!


①在1的一方的class文件中加入多的一方的set,, 例子:private Set citylist=new HashSet();也需要加入对应setget方法。

②在1的一方的映射文件中对应<set name="ciitylist>

                                                        <key column="pid">//外键,即通过pid可以找到city的

                                                        <one-to-many class="....">//多的那方的class全名

                                                       </set>

多的那方和一般的一样cid,cname,pid,的setget方法和构造方法

在拿到1的那方的对象后,如province 的p对象,可以通过调用p.getCityList()方法拿到city的list遍历输出city

测试方法:

形式1:

。。调用方法openSession();

Query query=session.executequerty("from province where pid=?");

query.setInteger(0,1);

List<province> provinces=query.list();

for(province pro:provinces)

{

System.out.println(pro.getPname());

System.out.println(pro.getCityList().size());

for(Object obj:pro.getCityList())
{
city city=(city)obj;
System.out.println(city.getCname());
}
}
session.close();
}

}

形式2:有返回值型

failed to lazily initialize a collection of role: com.hibernate.entity.province.cityList, no session or session was closed:懒加载,原因是在没访问多表则不加载,理想方法是在关闭session前加载一下。

province pro=(province) query.uniqueResult();
for(Object obj:pro.getCityList())
{
Hibernate.initialize(obj);
}

往往用一个参数,控制是否需要懒加载,,当不用加载多表时就不需要懒加载

--------------

public class testonetomany {


public static province queryProvince(Integer pid,Integer o)
{
Configuration conf=new Configuration().configure();
SessionFactory sf=conf.buildSessionFactory();
Session session=sf.openSession();
Query query=session.createQuery("from province where pid=?");
query.setInteger(0, pid);
province pro=(province) query.uniqueResult();
if(o!=null){
for(Object obj:pro.getCityList())
{
Hibernate.initialize(obj);
}
}
session.close();
return pro;
}


public static void main(String[] args) {

province pro=queryProvince(1,1);
System.out.println(pro.getPname());
System.out.println(pro.getCityList().size());
for(Object obj:pro.getCityList())
{
city city=(city)obj;
System.out.println(city.getCname());
}
}

0 0
原创粉丝点击