我用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中也添加一条记录该如何做
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中也添加一条记录该如何做
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货