我用spring+hibernate+struts写一个bbs,其中有两个类
public class Bbs {
 private int bbsId;
 private Board board;//表示某个版面
 private User author;//表示bbs的作者
......省略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" >
<hibernate-mapping package="com.foxconn.hz.bbs.entity.bbs">
 <class name="Bbs" table="bbs" lazy="false" dynamic-insert="true" dynamic-update="true">
  <id name="bbsId" column="bbs_id">
   <generator class="sequence">
    <param name="sequence">seq_bbs_id</param>
   </generator>
  </id>  
  <many-to-one name="board" column="board_id" class="com.foxconn.hz.bbs.entity.board.Board" />
 </class>
</hibernate-mapping>
另一个类
public class Board {
 private int boardId;
 private Set<Object> bbs = new HashSet<Object>();
......省略get,set方法
}
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" >
<hibernate-mapping package="com.foxconn.hz.bbs.entity.board">
 <class name="Board" table="board" lazy="false" >
  <id name="boardId" column="board_id">
   <generator class="sequence">
    <param name="sequence">seq_board_id</param>
   </generator>
  </id>
  <set name="bbs" lazy="false" cascade="save-update,persist">
   <key column="board_id"/>
   <one-to-many class="com.foxconn.hz.bbs.entity.bbs.Bbs"/>
  </set>
 </class>
</hibernate-mapping>
spring的配置文件如下
<?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">
<!--
  - Root application context for the Countries application.
  - Web-specific beans are defined in "countries-servlet.xml".
  -->
<beans>
 
 <!-- database -->
 <bean id="dataSource"
   class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName">
   <value>oracle.jdbc.driver.OracleDriver</value>
  </property>
  <property name="url">
   <value>jdbc:oracle:thin:@localhost:1521:univser</value>
  </property>
  <property name="username">
   <value>bbs</value>
  </property>
  <property name="password">
   <value>bbs</value>
  </property>
 </bean>
 
 <!-- define Hibernate SessionFactory  -->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref bean="dataSource"/>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.Oracle9Dialect
    </prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
  <property name="mappingResources">
   <list>
    <value>com/foxconn/hz/bbs/entity/board/board.hbm.xml</value>
    <value>com/foxconn/hz/bbs/entity/bbs/bbs.hbm.xml</value>
   </list>
  </property>
 </bean>
<!-- end db -->
 <bean id="boardDao" class="com.foxconn.hz.bbs.service.imp.BoardBiz">
  <property name="sessionFactory">
   <ref local="sessionFactory"/>
  </property>
 </bean>
 <bean id="bbsDao" class="com.foxconn.hz.bbs.service.imp.BbsBiz">
  <property name="sessionFactory">
   <ref local="sessionFactory"/>
  </property>
 </bean>
</beans>我写了一个测试方法
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");
  
  Board board = boardDao.getBoardById(0);//
  System.out.println(board.getBoardName());//这一行执行正确的
  
  Bbs bbs = new Bbs();
  bbs.setBoard(board);
  bbsDao.addBbs(bbs);//实现添加一条bbs的记录,bbs与board是多对一的关系
 }
}
我写的boardDao.getBoardById()方法是
 public Board getBoardById(int id) {
  return (Board)getHibernateTemplate().get(Board.class, id);
 }
当执行bbsDao.addBbs(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:29)
 at com.foxconn.hz.bbs.service.imp.Test.main(Test.java:26)
错误提示是board不是一个持久化的对象,可是通过方法getHibernateTemplate().get(Board.class, id)从数据库的主键得到的不是一个持久化的对象吗?
如果我在board.hbm.xml的<set>标签中加上cascade="save-update,persist"通过级联也可以实现,但是那样做会同时在board表中也添加一条记录,如果我不想在表board中也添加一条记录该如何做