hibernat多对一单项关联时时,更新mang方一直出问题,求救高手!!

bizhenchao1201 2005-12-09 02:08:02
现在我在学习hibernate的时候遇到了一点问题,希望给以提示,谢谢:
我现在做了一个小的工程,是一个图书借阅的例子:
1、我用的数据库是access。
2、有两张表:book(ID,BOOK_NAME,BOOK_ISDN,USER_ID)表和user(ID,BUER_NAME,USER_PASSWORD)表,book表通过外健USER_ID 与user表主键ID关联,我的意思是这样的:如果用户借了这本书,那么在book表中,将 USER_ID更新为用户的ID,如果客户还书,就把 USER_ID更新为null 。
3、建立持久化类,这个就不说了,就是在book类中声明了一个user类。
4、建立两个配置文件,我建立的是多对一的单项关联,最重要的是book.hbm.xml中的<many-to-one name=“”colunm=“”class=“”>
到这里,我已经可以运行了,可以通过书名来查询借阅人的信息,这个是能够跑通的,问题是出在这里:
当用户要还书的时候,逻辑上应该这么操作,把book表中的 USER_ID更新为空,我是这样操作的,先取出这个book对象,然后将它的user属性设置为null(book.setUser(null)),然后提交事务就一直出抛异常,执行不成功。
我觉得:虽然是将 user属性设置为null(book.serUser(null))了,但是更新的时候hibernate无法去处理与book相关联的user持久类,应该是配置文件没有弄好,但是我不知道怎么去修改,能否给个提示,不胜感激!!
...全文
291 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bizhenchao1201 2005-12-16
  • 打赏
  • 举报
回复
你把你的book表的hibernate配置文件中的userid的相应的映射字段的属性
<property name="userID" column="userID" type="java.lang.Double" not-null="true" />
中的not-null="true"去掉就OK了!


回复:因为book表的外健userID是可以未空的(如果没有人借这本书,这本书的userID的就是空),如果设置成not-null="true" 注册一本新书的时候会不会出错呢?因为刚添加一本新书肯定是没有人借阅的。
bizhenchao1201 2005-12-16
  • 打赏
  • 举报
回复
book配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="hibernate.cn.bo">
<class name="HibernateBook" dynamic-update = "true" table="hibernate_book" >
<id name="id" column="BOOK_ID" type="long">
<generator class="increment"/>
</id>
<property name="bookName" column="BOOK_NAME" type="string"/>
<property name="bookISDN" column="BOOK_ISDN" type="string"/>

<many-to-one name="hibernateUserRegister" column="STUDENT_ID"
cascade="save-update"
not-null="false"
class="HibernateUserRegister" />

</class>
</hibernate-mapping>

还书和借书的方法,一直出问题
public boolean updateBookByReturnBook(HibernateUserRegister user, String bookName) throws Exception {
boolean bool = false;
try {
session = sessionFactory.openSession();
tx = session.beginTransaction();

session.update(user);
HibernateBook book = queryByBookName(bookName);
session.update(book);
book.setHibernateUserRegister(null);
user.getBookId.remove(book);
tx.commit();

bool = true;
} catch (Exception e) {
try {
tx.rollback();
} catch (Exception e1) {
e1.printStackTrace();
}
return bool;
} finally {
session.close();
sessionFactory.close();
}
return bool;
}

public boolean save(HibernateBook book) throws Exception {
boolean bool = false;
try {
session = sessionFactory.openSession();
tx = session.beginTransaction();
session.save(book);
tx.commit();
bool = true;
} catch (Exception e) {
tx.rollback();
return bool;
} finally {
session.close();
sessionFactory.close();
}
return bool;
}
public boolean updateBookByBorrowBook(HibernateUserRegister user, String bookName) throws Exception {
boolean bool = false;
try {
session = sessionFactory.openSession();
tx = session.beginTransaction();
session.update(user);
HibernateBook book = queryByBookName(bookName);
session.update(book);
user.getBookId.add(book);
book.setHibernateUserRegister(user);
tx.commit();
bool = true;
} catch (Exception e) {
try {
tx.rollback();
} catch (Exception e1) {
e1.printStackTrace();
}
return bool;
} finally {
session.close();
sessionFactory.close();
}
return bool;
}



idea_stuats 2005-12-15
  • 打赏
  • 举报
回复
如果去掉了出错!就这样book.getUser.setUserID(null)就OK了,因为user是对象属性,如果你设置为NULL的话,hibernate执行影射更新的时候会应用到一个动作:user.getUserID(),以为你设置user为空了,所以user.getUserID()肯定跑错空指针错了!
idea_stuats 2005-12-15
  • 打赏
  • 举报
回复
你把你的book表的hibernate配置文件中的userid的相应的映射字段的属性
<property name="userID" column="userID" type="java.lang.Double" not-null="true" />
中的not-null="true"去掉就OK了!
java_augur 2005-12-15
  • 打赏
  • 举报
回复
如果不是赋给null,试着赋给一个空字串。
bizhenchao1201 2005-12-12
  • 打赏
  • 举报
回复
user 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="hibernate.cn.bo">
<class name="HibernateUserRegister" dynamic-update="true"
table="hibernate_user_register">
<id column="ID" name="id" type="long">
<generator class="increment" />
</id>

<property name="uerName" column="USER_NAME" type="string" />
<property name="password" column="PASSWORD" type="string" />
<property name="sex" column="SEX" type="string" />
<property name="studentCard" column="STUDENT_CARD"
type="string" />
<property name="idCard" column="ID_CARD" type="string" />
<set name="bookId" table="HIBERNATE_BOOK" inverse="true" cascade="save-update">
<key column="STUDENT_ID" />
<one-to-many class="HibernateBook" not-null="false"/>
</set>
</class>
</hibernate-mapping>
bizhenchao1201 2005-12-12
  • 打赏
  • 举报
回复
user类:public class HibernateUserRegister implements Serializable{
private Long id;
private String uerName;
private String password;
private String rePassword;
private String sex;
private String studentCard;
private String idCard;
private Set bookId = new HashSet();
public HibernateUserRegister(){

}
/**
* @return Returns the id.
*/
public Long getId() {
return id;
}
/**
* @param id The id to set.
*/
private void setId(Long id) {
this.id = id;
}
/**
* @return Returns the idCard.
*/
public String getIdCard() {
return idCard;
}
/**
* @param idCard The idCard to set.
*/
public void setIdCard(String idCard) {
this.idCard = idCard;
}
/**
* @return Returns the password.
*/
public String getPassword() {
return password;
}
/**
* @param password The password to set.
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return Returns the rePassword.
*/
public String getRePassword() {
return rePassword;
}
/**
* @param rePassword The rePassword to set.
*/
public void setRePassword(String rePassword) {
this.rePassword = rePassword;
}
/**
* @return Returns the sex.
*/
public String getSex() {
return sex;
}
/**
* @param sex The sex to set.
*/
public void setSex(String sex) {
this.sex = sex;
}
/**
* @return Returns the studentCard.
*/
public String getStudentCard() {
return studentCard;
}
/**
* @param studentCard The studentCard to set.
*/
public void setStudentCard(String studentCard) {
this.studentCard = studentCard;
}
/**
* @return Returns the uerName.
*/
public String getUerName() {
return uerName;
}
/**
* @param uerName The uerName to set.
*/
public void setUerName(String uerName) {
this.uerName = uerName;
}

/**
* @return Returns the bookId.
*/
public Set getBookId() {
return bookId;
}
/**
* @param bookId The bookId to set.
*/
public void setBookId(Set bookId) {
this.bookId = bookId;
}
}
bizhenchao1201 2005-12-12
  • 打赏
  • 举报
回复
我现在已经换成了mysql数据库,晚上就把配置文件和代码贴上来
skycncomp 2005-12-11
  • 打赏
  • 举报
回复
把你的xml和更新的代码给出来.

另,为什么要用access db呢?做练习可以考虑用mysql也很好的。
ybyq 2005-12-11
  • 打赏
  • 举报
回复
我学Hibernate也不是很好。
但是可以提醒你以下:
我想知道你的那个USER类的USER。HBM。XML的配置文件是什么?
我想问题应该出现在这里的

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧