你好,能帮我解决上述问题吗?十分感谢
以下是我的代码
表结构:
create table book (--图书基本信息表
bookId number primary key, --图书编号
bookName varchar2(50) not null , --图书名
bookType varchar2(50) not null , --图书类别
publish varchar2(50), --出版社
author varchar2(50), --作者
price varchar2(50), --定价
bookTotal number,--在库数量
bookContent varchar2(200)--图书介绍
);
create table userInfo (--用户信息表
userId number primary key, --用户id号
userPs varchar2(50) not null,--用户密码
userName varchar2(50) not null, --用户名
sex varchar2(10) not null --性别
);
create table booklendinfo(--图书借阅信息表
id number primary key,--主键标记
bookId number not null, --书号
userId number not null , --用户号
lendDate date not null , --借书时间
returnDate date , --还书时间
foreign key(bookId) references book(bookId) on delete cascade ,
foreign key(userId) references userInfo(userId) on delete cascade
);
public Book searchBookByInfo(BookLendInfo info){
System.out.println("info:"+info);
Book book=info.getBook();
book.getAuthor();
System.out.println("book:"+book);
return book;
}
上面是UserDaoImpl里面的方法,返回booklendinfo中的book对象,其中UserDaoImpl实现了UserDao接口,然后我在jsp中调用,请接着看下面的代码
if(request.getAttribute("list")!=null){
List list=(List)request.getAttribute("list");//获取借书列表
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
UserDao userDao=(UserDao)ctx.getBean("userDaoProxy");//获取代理dao
Iterator it=list.iterator();
while(it.hasNext())
{
BookLendInfo info=(BookLendInfo)it.next();
Book book=userDao.searchBookByInfo(info);
System.out.println("book"+book);
我用了spring事务了,还是不行啊
<bean id="userDaoProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDao" />
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly </prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly </prop>
<prop key="save*">PROPAGATION_REQUIRED </prop>
<prop key="insert*">PROPAGATION_REQUIRED </prop>
<prop key="update*">PROPAGATION_REQUIRED </prop>
<prop key="return*">PROPAGATION_REQUIRED </prop>
<prop key="search*">PROPAGATION_REQUIRED </prop> //这就是上面方法的事务配置,UserDaoImpl中的searhBookByInfo方法
<prop key="*">PROPAGATION_REQUIRED,readOnly </prop>
</props>
</property>
</bean> <hibernate-mapping>
<class name="com.beans.BookLendInfo" table="BOOKLENDINFO" schema="SCOTT">
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
<many-to-one name="book" class="com.beans.Book" fetch="select">
<column name="BOOKID" precision="22" scale="0" not-null="true" />
</many-to-one>
<many-to-one name="userinfo" class="com.beans.UserInfo" fetch="select">
<column name="USERID" precision="22" scale="0" not-null="true" />
</many-to-one>
<property name="lenddate" type="java.util.Date">
<column name="LENDDATE" length="7" not-null="true" />
</property>
<property name="returndate" type="java.util.Date">
<column name="RETURNDATE" length="7" />
</property>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.beans.Book" table="BOOK" schema="SCOTT">
<id name="bookid" type="java.lang.Long">
<column name="BOOKID" precision="22" scale="0" />
<generator class="increment" >
</generator>
</id>
<property name="bookname" type="java.lang.String">
<column name="BOOKNAME" length="50" not-null="true" />
</property>
<property name="booktype" type="java.lang.String">
<column name="BOOKTYPE" length="50" not-null="true" />
</property>
<property name="publish" type="java.lang.String">
<column name="PUBLISH" length="50" />
</property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" length="50" />
</property>
<property name="price" type="java.lang.String">
<column name="PRICE" length="50" />
</property>
<property name="booktotal" type="java.lang.Long">
<column name="BOOKTOTAL" precision="22" scale="0" />
</property>
<property name="bookcontent" type="java.lang.String">
<column name="BOOKCONTENT" length="200" />
</property>
<set name="booklendinfos" inverse="true" cascade="save-update" lazy="false">
<key>
<column name="BOOKID" precision="22" scale="0" not-null="true" />
</key>
<one-to-many class="com.beans.BookLendInfo" />
</set>
</class>
</hibernate-mapping>
以下是我的代码
表结构:
create table book (--图书基本信息表
bookId number primary key, --图书编号
bookName varchar2(50) not null , --图书名
bookType varchar2(50) not null , --图书类别
publish varchar2(50), --出版社
author varchar2(50), --作者
price varchar2(50), --定价
bookTotal number,--在库数量
bookContent varchar2(200)--图书介绍
);
create table userInfo (--用户信息表
userId number primary key, --用户id号
userPs varchar2(50) not null,--用户密码
userName varchar2(50) not null, --用户名
sex varchar2(10) not null --性别
);
create table booklendinfo(--图书借阅信息表
id number primary key,--主键标记
bookId number not null, --书号
userId number not null , --用户号
lendDate date not null , --借书时间
returnDate date , --还书时间
foreign key(bookId) references book(bookId) on delete cascade ,
foreign key(userId) references userInfo(userId) on delete cascade
);
public Book searchBookByInfo(BookLendInfo info){
System.out.println("info:"+info);
Book book=info.getBook();
book.getAuthor();
System.out.println("book:"+book);
return book;
}
上面是UserDaoImpl里面的方法,返回booklendinfo中的book对象,其中UserDaoImpl实现了UserDao接口,然后我在jsp中调用,请接着看下面的代码
if(request.getAttribute("list")!=null){
List list=(List)request.getAttribute("list");//获取借书列表
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
UserDao userDao=(UserDao)ctx.getBean("userDaoProxy");//获取代理dao
Iterator it=list.iterator();
while(it.hasNext())
{
BookLendInfo info=(BookLendInfo)it.next();
Book book=userDao.searchBookByInfo(info);
System.out.println("book"+book);
我用了spring事务了,还是不行啊
<bean id="userDaoProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDao" />
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly </prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly </prop>
<prop key="save*">PROPAGATION_REQUIRED </prop>
<prop key="insert*">PROPAGATION_REQUIRED </prop>
<prop key="update*">PROPAGATION_REQUIRED </prop>
<prop key="return*">PROPAGATION_REQUIRED </prop>
<prop key="search*">PROPAGATION_REQUIRED </prop> //这就是上面方法的事务配置,UserDaoImpl中的searhBookByInfo方法
<prop key="*">PROPAGATION_REQUIRED,readOnly </prop>
</props>
</property>
</bean> <hibernate-mapping>
<class name="com.beans.BookLendInfo" table="BOOKLENDINFO" schema="SCOTT">
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
<many-to-one name="book" class="com.beans.Book" fetch="select">
<column name="BOOKID" precision="22" scale="0" not-null="true" />
</many-to-one>
<many-to-one name="userinfo" class="com.beans.UserInfo" fetch="select">
<column name="USERID" precision="22" scale="0" not-null="true" />
</many-to-one>
<property name="lenddate" type="java.util.Date">
<column name="LENDDATE" length="7" not-null="true" />
</property>
<property name="returndate" type="java.util.Date">
<column name="RETURNDATE" length="7" />
</property>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.beans.Book" table="BOOK" schema="SCOTT">
<id name="bookid" type="java.lang.Long">
<column name="BOOKID" precision="22" scale="0" />
<generator class="increment" >
</generator>
</id>
<property name="bookname" type="java.lang.String">
<column name="BOOKNAME" length="50" not-null="true" />
</property>
<property name="booktype" type="java.lang.String">
<column name="BOOKTYPE" length="50" not-null="true" />
</property>
<property name="publish" type="java.lang.String">
<column name="PUBLISH" length="50" />
</property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" length="50" />
</property>
<property name="price" type="java.lang.String">
<column name="PRICE" length="50" />
</property>
<property name="booktotal" type="java.lang.Long">
<column name="BOOKTOTAL" precision="22" scale="0" />
</property>
<property name="bookcontent" type="java.lang.String">
<column name="BOOKCONTENT" length="200" />
</property>
<set name="booklendinfos" inverse="true" cascade="save-update" lazy="false">
<key>
<column name="BOOKID" precision="22" scale="0" not-null="true" />
</key>
<one-to-many class="com.beans.BookLendInfo" />
</set>
</class>
</hibernate-mapping>
而你的页面已经离开事务session了。当然也就不能加载了,解决方式有3个
1 使用一个 open session in view 的东西
2 把lazy 改成 eager
3 在使用时,事务代码里调用一下那个东西,就会自动读取了。我个人一般用3,这样能保证我需要的方法会有内容,不需要的就节省了。,
public Book searchBookByInfo(BookLendInfo info){ //UserDaoImpl里的代码,实现了UserDao接口
Book book=info.getBook();
return book;
}
我已经调用search*方法了呀!!
我是想从子表中取出父表对象,再取出父表的一些属性,也就是级联查询(头疼)您能告知吗?急
这个异常。。我打算取出book对象,再取出图书的一些信息,比如书名,书的出版设等。。
<class name="com.beans.Book" table="BOOK" schema="SCOTT" lazy="false">
<id name="bookid" type="java.lang.Long">
<column name="BOOKID" precision="22" scale="0" />
<generator class="increment" >
</generator>
</id>
<property name="bookname" type="java.lang.String">
<column name="BOOKNAME" length="50" not-null="true" />
</property>
<property name="booktype" type="java.lang.String">
<column name="BOOKTYPE" length="50" not-null="true" />
</property>
<property name="publish" type="java.lang.String">
<column name="PUBLISH" length="50" />
</property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" length="50" />
</property>
<property name="price" type="java.lang.String">
<column name="PRICE" length="50" />
</property>
<property name="booktotal" type="java.lang.Long">
<column name="BOOKTOTAL" precision="22" scale="0" />
</property>
<property name="bookcontent" type="java.lang.String">
<column name="BOOKCONTENT" length="200" />
</property>
<set name="booklendinfos" inverse="true" cascade="save-update" lazy="false">
<key>
<column name="BOOKID" precision="22" scale="0" not-null="true" />
</key>
<one-to-many class="com.beans.BookLendInfo" />
</set>
</class>
</hibernate-mapping>
<class name="com.beans.Book" table="BOOK" schema="SCOTT" lazy="false">
<id name="bookid" type="java.lang.Long">
<column name="BOOKID" precision="22" scale="0" />
<generator class="increment" >
</generator>
</id>
<property name="bookname" type="java.lang.String">
<column name="BOOKNAME" length="50" not-null="true" />
</property>
<property name="booktype" type="java.lang.String">
<column name="BOOKTYPE" length="50" not-null="true" />
</property>
<property name="publish" type="java.lang.String">
<column name="PUBLISH" length="50" />
</property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" length="50" />
</property>
<property name="price" type="java.lang.String">
<column name="PRICE" length="50" />
</property>
<property name="booktotal" type="java.lang.Long">
<column name="BOOKTOTAL" precision="22" scale="0" />
</property>
<property name="bookcontent" type="java.lang.String">
<column name="BOOKCONTENT" length="200" />
</property>
<set name="booklendinfos" inverse="true" cascade="save-update" lazy="false">
<key>
<column name="BOOKID" precision="22" scale="0" not-null="true" />
</key>
<one-to-many class="com.beans.BookLendInfo" />
</set>
</class>
</hibernate-mapping>