hibernate save方法

[复制链接]
查看11 | 回复3 | 2010-7-3 10:21:02 | 显示全部楼层 |阅读模式
比如


有主表T1,从表T2,T1中的T2属性是用Set存储的

T1中Set设置了 inverse="true" cascade="save-update"
T1 t1 = new T1();
T2 t2 = new T2();
t2.setT1(t1);
Set t2s = new HashSet();
t2s.add(t2);
t1.setT2(t2s);
sessoin.save(t1);
代码有点乱~~~~
为什么在保存主表时出现了三条SQL语句
一条查询,两条插入
1.为什么会多出一条查询语句?(最好详细点,不太明白)
2.如何去掉多出的一条查询语句?
等待前辈解答
Country country = new Country();
country.setId(10);
country.setName("a");

Province province1 = new Province();
province1.setId(101);
province1.setName("a1");
province1.setCountry(country);

Set pSet = new HashSet();
pSet.add(province1);

country.setProvinces(pSet);
try {
session.beginTransaction();
session.save(country);
session.getTransaction().commit();

} catch (Exception e) {
e.printStackTrace();
}finally{
session.close();
}
我debug了下,就是在save的时候出现了一条查询语句,在commit时出现了插入语句,如果往set集合中再插入一个值,对应的又会在多出一条查询语句~~~
请问下,如果我把级联删除了,然后分别保存(先保存Country,后保存Province),现在我只不过是手动保存,为什么不出现查询语句了?难道hibernate的cascade机制就是这样:在插入从表数据就先检查从表中是否存在该数据?希望各位前辈给我个准确的答案,谢谢了!

回复

使用道具 举报

千问 | 2010-7-3 10:21:02 | 显示全部楼层
其实很简单,当子类(Province)要进行保存操作的时候,要先到数据库里面去查询是否已经存在了,如果存在了就调用update,否则就是 insert,这就产生了那条select,也不能说影响性能,正常的jdbc的时候也需要这么判断的。
回复

使用道具 举报

千问 | 2010-7-3 10:21:02 | 显示全部楼层
你是不是哪里写了一天GET语句,没写的话,代码发详细一点,修改底层什么机制 别听他胡扯
回复

使用道具 举报

千问 | 2010-7-3 10:21:02 | 显示全部楼层
hibernate 把操作数据库的语句都给封装了起来,至于为什么出现三条SQL语句,应该是HIBERNATE的机制问题。要去掉多出的那条查询语句,就只有你自己去修改HIBERNATE的底层代码了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行