我在用spring和hibernate写一个bbs的时候遇到一个问题
其中有三个JAVABean,
一个是
//论坛的留言
public class Bbs {
private int bbsId;
private String bbsTitle;
private String bbsContent;
private Board board;//论坛版块
private User author;
......省略get,set方法
}
bbs.hbm.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
seq_bbs_id
一个JAVABEAN是
//论坛的版块
public class Board {
private int boardId;
......省略其他属性
private Set bbs = new HashSet();//表示留言,是一对多的关系
......省略set,get方法
}
board.hbm.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
seq_board_id
还有一个是用户类
public class User {
private int userId;
......省略其他属性
private Set bbs = new HashSet();
......省略get,set方法
}
user.hbm.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
seq_user_id
......省略其他属性配置
我的spring的配置文件applicationContext.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!-- database -->
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521:univser
bbs
bbs
<!-- define Hibernate SessionFactory -->
org.hibernate.dialect.Oracle9Dialect
true
com/foxconn/hz/bbs/entity/user/user.hbm.xml
com/foxconn/hz/bbs/entity/board/board.hbm.xml
com/foxconn/hz/bbs/entity/bbs/bbs.hbm.xml
有三个接口userDao,bbsDao,boardDao,分别实现的方法是
userDao.getUserById(int id){
return (User)getHibernateTemplate().get(User.Class,id);
}
boardDao.getBoardById(int id){
return (Board)getHibernateTemplate().get(Board.Class,id);
}
bbsDao.addBbs(Bbs bbs){
getHibernateTemplate().save(bbs);
}
我又写了一个测试方法
//实现对bbs对象的持久化
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
BoardDao boardDao = (BoardDao)ctx.getBean("boardDao");
BbsDao bbsDao = (BbsDao)ctx.getBean("bbsDao");
UserDao userDao = (UserDao)ctx.getBean("userDao");
Board board = boardDao.getBoardById(0);
User user = userDao.getUserById(0);
System.out.println(board);//执行正确
System.out.println(user);//执行正确
Bbs bbs = new Bbs();
bbs.setAuthor(user);
bbs.setBoard(board);
bbsDao.addBbs(bbs);
}
}
如果我只将user对象set到bbs中,然后持久化bbs,程序运行正确
当我将board对象set到bbs中的时候,就出错,报错信息是
Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: com.foxconn.hz.bbs.entity.board.Board; nested exception is org.hibernate.TransientObjectException: com.foxconn.hz.bbs.entity.board.Board
Caused by: org.hibernate.TransientObjectException: com.foxconn.hz.bbs.entity.board.Board
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:221)
at org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:476)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:2803)
at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:467)
at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:190)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:113)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:632)
at com.foxconn.hz.bbs.service.imp.BbsBiz.addBbs(BbsBiz.java:27)
at com.foxconn.hz.bbs.service.imp.Test.main(Test.java:31)
从错误提示看,是set到bbs对象中的board对象的一个非持久态的对象,导致bbs不能实现持久化,我用getHibernateTemplate().get(Board.Class,id)得到的不是一个持久态的对象吗?还有我不理解的就是set user对象的时候却没有错误,我看了好几遍User类和Board类都是一样的,包括数据库的结构也是一样的,但是结果为什么不一样呢?这个问题困扰我好几天了。