数据库:-- Create table
create table T_USER
(
userid NUMBER(10) not null,
username VARCHAR2(255 CHAR),
scontent CLOB
)User的映射文件: <class name="com.jungle.po.User" table="t_user">
<id name="userid" column="userid" type="integer">
<generator class="native" />
</id>
<property name="username" column="username" type="string"></property>
<property name="scontent" column="scontent" type="string"></property> <set name="details" cascade="all" lazy="true">
<key column="userid"></key>
<one-to-many class="com.jungle.po.Detail" />
</set>
</class>
<class name="com.jungle.po.Detail" table="t_detail" >
<id name="detailid" column="detailid" type="integer">
<generator class="native" />
</id>
<property name="detailname" column="detailname" type="string"></property> <many-to-one name="user" column="userid" class="com.jungle.po.User"></many-to-one>
</class>
//无论是get还是load使用user.getScontent()都能得到数据库中的clob为什么
public static void testGet() {
Session session = HibernateSessionFactory.getSession();
User user = (User) session.get(User.class, 1);
System.out.println(user.getUsername());
System.out.println(user.getScontent());
System.out.println(user.getDetails());
HibernateSessionFactory.closeSession(); }
请问为什么 属性的lazy="true" 为什么get的时候还是会得到
load默认就是懒加载 所有我认为lazy="true" 是让get的时候不加载
可是给属性设置lazy="true"查看打印出来的sql还是查询了lazy="true"的属性
create table T_USER
(
userid NUMBER(10) not null,
username VARCHAR2(255 CHAR),
scontent CLOB
)User的映射文件: <class name="com.jungle.po.User" table="t_user">
<id name="userid" column="userid" type="integer">
<generator class="native" />
</id>
<property name="username" column="username" type="string"></property>
<property name="scontent" column="scontent" type="string"></property> <set name="details" cascade="all" lazy="true">
<key column="userid"></key>
<one-to-many class="com.jungle.po.Detail" />
</set>
</class>
<class name="com.jungle.po.Detail" table="t_detail" >
<id name="detailid" column="detailid" type="integer">
<generator class="native" />
</id>
<property name="detailname" column="detailname" type="string"></property> <many-to-one name="user" column="userid" class="com.jungle.po.User"></many-to-one>
</class>
//无论是get还是load使用user.getScontent()都能得到数据库中的clob为什么
public static void testGet() {
Session session = HibernateSessionFactory.getSession();
User user = (User) session.get(User.class, 1);
System.out.println(user.getUsername());
System.out.println(user.getScontent());
System.out.println(user.getDetails());
HibernateSessionFactory.closeSession(); }
请问为什么 属性的lazy="true" 为什么get的时候还是会得到
load默认就是懒加载 所有我认为lazy="true" 是让get的时候不加载
可是给属性设置lazy="true"查看打印出来的sql还是查询了lazy="true"的属性
<property name="username" column="username" type="string" lazy="true"></property>
<property name="scontent" column="scontent" type="string" lazy="true"></property>
scontent为大字段就算lazy="true"都会加载这个属性!
单端:
<set name="" table="" cascade="all" inverse="true" >
<key column="" />
<one-to-many class=""/>
</set>多端:
<many-to-one name="" column="" class="" lazy="true" not-null="true" />
检测 是否开启 有个好方法 用debug 断点测试吧. 开启懒加载. 会发现 hibernate 帮你创建了一个 代理类
//你延迟加载是加载Detail的数据,而不是user的数据啊.user.getScontent()当然能取到内容.
public static void testGet() {
Session session = HibernateSessionFactory.getSession();
User user = (User) session.get(User.class, 1);
System.out.println(user.getUsername());
HibernateSessionFactory.closeSession();
System.out.println(user.getDetails()); //这里session已经关闭,所以这里取延迟加载数据会出错
////////////////////////////////////////////////////////////////////////////////////
//如果你不想取user时把scontent 取出来,你可以用load取
Session session = HibernateSessionFactory.getSession();
User user = (User) session.load(User.class, 1); //这里不会发sql语句去数据库取,只是一个代理对象
HibernateSessionFactory.closeSession();
System.out.println(user.getScontent()); //session关闭,取数出错,如果是get的话,这里就不会出错
}
+++
keyi可以看看session
可是我的session是在最后才关闭的!老师说这个版本的 hibernate属性lazy无效!我也感觉很是奇怪 !