i have two PO : user 1 - 1 forumuser , i don't use one-to-one relation in mapping ,just use forumuser many-to-one user
in my business:
1.load user and forumuser , set the user to forumuser
2.in UI , edit some infos of them
3.update them in logic layer.
i can successfully save user info when i use flush. but in next step when i save the forumuser in the same way , something gone wrong. the exception like below:
Code:
ERROR [2003-11-01 18:21:58,664] net.sf.hibernate.AssertionFailure - An AssertionFailure occured - this may indicate a bug in Hibernate
java.lang.UnsupportedOperationException: Can't write to a readonly object
at net.sf.hibernate.cache.ReadOnlyCache.release(ReadOnlyCache.java:39)
at net.sf.hibernate.impl.ScheduledUpdate.afterTransactionCompletion(ScheduledUpdate.java:36)
at net.sf.hibernate.impl.SessionImpl.afterTransactionCompletion(SessionImpl.java:459)
at net.sf.hibernate.impl.SessionImpl.disconnect(SessionImpl.java:2958)
at net.sf.hibernate.impl.SessionImpl.close(SessionImpl.java:438)
at net.magician.util.HibernateSessionFactory.closeSession(HibernateSessionFactory.java:60)
at net.magician.business.forumnuke.dao.hibernate.ForumUserDAOHibernateImpl.saveForumUser(ForumUserDAOHibernateImpl.java:59)
at net.magician.business.forumnuke.helper.ForumUserHelper.saveOrUpdateForumUser(ForumUserHelper.java:63)
at net.magician.business.forumnuke.action.SaveUserProfileAction.execute(SaveUserProfileAction.java:51)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at net.magician.business.forumnuke.util.ForumNukeAuthFilter.doFilter(ForumNukeAuthFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:594)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)
at java.lang.Thread.run(Thread.java:534)
and this is my code and mapping file:
User.java
Code:
package net.magician.business.usermanager.views;
import java.util.Date;
/**
* 用户对象
*
* @hibernate.class table="User" dynamic-insert="true" dynamic-update="true"
* @hibernate.jcs-cache usage="read-write"
*/
public class User
{
/**
* 用户ID
*/
private int userID;
/**
* 用户名
*/
private String userName;
/**
* 注册日期
*/
private Date registerDate;
/**
* 用户EMAIL
*/
private String email;
/**
* QQ号码
*/
private String QQ;
/**
* MSN号码
*/
private String MSN;
/**
* 性别,TURE为男,FALSE为女
*/
private boolean sex;
/**
* 来自
*/
private String location;
/**
* 密码
*/
private String passWord;
/**
* 用户取回密码时提示问题
*/
private String passWordQuestion;
/**
* 用户取回密码时提示问题答案
*/
private String passWordQuestionAnswer;
public User()
{
}
/**
* @hibernate.id generator-class="native" unsaved-value="0"
*/
public int getUserID()
{
return userID;
}
public void setUserID(int aUserID)
{
userID = aUserID;
}
/**
* @hibernate.property length="16" not-null="true"
*/
public String getUserName()
{
return userName;
}
public void setUserName(String aUserName)
{
userName = aUserName;
}
/**
* @hibernate.property
*/
public java.util.Date getRegisterDate()
{
return registerDate;
}
public void setRegisterDate(java.util.Date aRegisterDate)
{
registerDate = aRegisterDate;
}
/**
* @hibernate.property length="50" not-null="true"
*/
public String getEmail()
{
return email;
}
public void setEmail(String aEmail)
{
email = aEmail;
}
/**
* @hibernate.property length="15"
*/
public String getQQ()
{
return QQ;
}
public void setQQ(String aQQ)
{
QQ = aQQ;
}
/**
* @hibernate.property length="50"
*/
public String getMSN()
{
return MSN;
}
public void setMSN(String aMSN)
{
MSN = aMSN;
}
/**
* @hibernate.property
*/
public boolean getSex()
{
return sex;
}
public void setSex(boolean aSex)
{
sex = aSex;
}
/**
* @hibernate.property length="16"
*/
public String getLocation()
{
return location;
}
public void setLocation(String string)
{
location = string;
}
/**
* @hibernate.property length="50"
*/
public String getPassWordQuestion()
{
return passWordQuestion;
}
public void setPassWordQuestion(String aPassWordQuestion)
{
passWordQuestion = aPassWordQuestion;
}
/**
* @hibernate.property length="50"
*/
public String getPassWordQuestionAnswer()
{
return passWordQuestionAnswer;
}
public void setPassWordQuestionAnswer(String aPassWordQuestionAnswer)
{
passWordQuestionAnswer = aPassWordQuestionAnswer;
}
/**
* @hibernate.property length="32" not-null="true"
*/
public String getPassWord()
{
return passWord;
}
public void setPassWord(String aPassWord)
{
passWord = aPassWord;
}
}
ForumUser.java
Code:
package net.magician.business.forumnuke.views;
import java.util.Date;
/**
* 论坛用户,与用户信息一一对应
*
* @hibernate.class table="ForumUser" dynamic-insert="true" dynamic-update="true" polymorphism="explicit"
* @hibernate.jcs-cache usage="read-write"
*/
public class ForumUser extends SimpleForumUser
{
/**
* 该论坛用户是否可用
*/
private boolean active;
/**
* 是否隐身登录
*/
private boolean invisible;
/**
* 是否接收悄悄话
*/
private boolean acceptPriMsg;
/**
* 是否自动登录
*/
private boolean autoLogin;
/**
* 有人回帖后是否邮件通知
*/
private boolean emailNotice;
/**
* 是否在帖子后附上签名
*/
private boolean showSign;
/**
* 最后访问时间
*/
private Date lastVisit;
public ForumUser()
{
}
/**
* @hibernate.property
*/
public java.util.Date getLastVisit()
{
return lastVisit;
}
public void setLastVisit(java.util.Date aLastVisit)
{
lastVisit = aLastVisit;
}
/**
* @hibernate.property
*/
public boolean getActive()
{
return active;
}
public void setActive(boolean aActive)
{
active = aActive;
}
/**
* @hibernate.property
*/
public boolean getInvisible()
{
return invisible;
}
public void setInvisible(boolean aInvisible)
{
invisible = aInvisible;
}
/**
* @hibernate.property
*/
public boolean getAcceptPriMsg()
{
return acceptPriMsg;
}
public void setAcceptPriMsg(boolean aAcceptPriMsg)
{
acceptPriMsg = aAcceptPriMsg;
}
/**
* @hibernate.property
*/
public boolean getAutoLogin()
{
return autoLogin;
}
public void setAutoLogin(boolean aAutoLogin)
{
autoLogin = aAutoLogin;
}
/**
* @hibernate.property
*/
public boolean getEmailNotice()
{
return emailNotice;
}
/**
* @hibernate.property
*/
public boolean getShowSign()
{
return showSign;
}
public void setEmailNotice(boolean b)
{
emailNotice = b;
}
public void setShowSign(boolean b)
{
showSign = b;
}
}
User.hbm.xml
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class
name="net.magician.business.usermanager.views.User"
table="User"
dynamic-update="true"
dynamic-insert="true"
>
<jcs-cache usage="read-write" />
<id
name="userID"
column="userID"
type="int"
unsaved-value="0"
>
<generator class="native">
</generator>
</id>
<property
name="userName"
type="java.lang.String"
update="true"
insert="true"
column="userName"
length="16"
not-null="true"
/>
<property
name="registerDate"
type="java.util.Date"
update="true"
insert="true"
column="registerDate"
/>
<property
name="email"
type="java.lang.String"
update="true"
insert="true"
column="email"
length="50"
not-null="true"
/>
<property
name="QQ"
type="java.lang.String"
update="true"
insert="true"
column="QQ"
length="15"
/>
<property
name="MSN"
type="java.lang.String"
update="true"
insert="true"
column="MSN"
length="50"
/>
<property
name="sex"
type="boolean"
update="true"
insert="true"
column="sex"
/>
<property
name="location"
type="java.lang.String"
update="true"
insert="true"
column="location"
length="16"
/>
<property
name="passWordQuestion"
type="java.lang.String"
update="true"
insert="true"
column="passWordQuestion"
length="50"
/>
<property
name="passWordQuestionAnswer"
type="java.lang.String"
update="true"
insert="true"
column="passWordQuestionAnswer"
length="50"
/>
<property
name="passWord"
type="java.lang.String"
update="true"
insert="true"
column="passWord"
length="32"
not-null="true"
/>
<!--
To add non XDoclet property mappings, create a file named
hibernate-properties-User.xml
containing the additional properties and place it in your merge dir.
-->
</class>
</hibernate-mapping>
ForumUser.hbm.xml
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class
name="net.magician.business.forumnuke.views.ForumUser"
table="ForumUser"
polymorphism="explicit"
dynamic-update="true"
dynamic-insert="true"
>
<jcs-cache usage="read-write" />
<id
name="forumUserID"
column="forumUserID"
type="int"
unsaved-value="0"
>
<generator class="native">
</generator>
</id>
<property
name="lastVisit"
type="java.util.Date"
update="true"
insert="true"
column="lastVisit"
/>
<property
name="active"
type="boolean"
update="true"
insert="true"
column="active"
/>
<property
name="invisible"
type="boolean"
update="true"
insert="true"
column="invisible"
/>
<property
name="acceptPriMsg"
type="boolean"
update="true"
insert="true"
column="acceptPriMsg"
/>
<property
name="autoLogin"
type="boolean"
update="true"
insert="true"
column="autoLogin"
/>
<property
name="emailNotice"
type="boolean"
update="true"
insert="true"
column="emailNotice"
/>
<property
name="showSign"
type="boolean"
update="true"
insert="true"
column="showSign"
/>
<many-to-one
name="user"
class="net.magician.business.usermanager.views.User"
cascade="none"
outer-join="true"
update="true"
insert="true"
column="userID"
not-null="true"
/>
<property
name="signature"
type="java.lang.String"
update="true"
insert="true"
column="signature"
length="500"
/>
<property
name="postCount"
type="int"
update="true"
insert="true"
column="postCount"
/>
<property
name="title"
type="java.lang.String"
update="true"
insert="true"
column="title"
length="100"
/>
<many-to-one
name="face"
class="net.magician.business.views.Pic"
cascade="all"
outer-join="true"
update="true"
insert="true"
column="faceID"
not-null="false"
/>
<!--
To add non XDoclet property mappings, create a file named
hibernate-properties-ForumUser.xml
containing the additional properties and place it in your merge dir.
-->
</class>
</hibernate-mapping>
any one can tell me what's wrong with my code?