Hibernate 3.2.6动态实体类型无法识别问题求助
嘿,我来帮你排查这个Hibernate的问题~你遇到的org.hibernate.HibernateException: could not determine type of dynamic entity错误,主要是继承映射配置不完整+映射文件语法/路径错误导致的,结合你提供的信息,给你几个具体的解决步骤:
1. 先修复映射文件的语法与路径问题
你给出的映射文件不仅没闭合标签,还存在包路径不匹配的问题:
- 首先补全缺失的闭合标签:
<hibernate-mapping package="cool.wxhy.tms.xyz"> <class name="ShortHand" table="ShortHand"> <id name="key" column="id" unsaved-value="null" type="string" > <generator class="assigned" /> </id> <property name="animal" column="animal" type="string"/> <property name="dog" column="dog" type="string"/> </class> </hibernate-mapping> - 注意:我把
package改成了cool.wxhy.tms.xyz,因为你的报错日志显示代码在这个包下,之前的bofa.pioneer.tms.objects和实际实体类路径不匹配,这会导致Hibernate找不到对应映射。
2. 处理继承映射关系
因为ShortHand继承了LongHand,但你只配置了子类的映射,Hibernate无法识别父类的属性和继承关系,这是核心问题。Hibernate 3.2.6支持三种继承映射策略,选适合你的场景:
方案一:单表继承(最简单)
所有父类和子类的属性都放在同一个表中,通过鉴别器字段区分类型。你只需要在父类的映射文件中配置子类:
<hibernate-mapping package="cool.wxhy.tms.xyz"> <class name="LongHand" table="ShortHand" discriminator-value="longhand"> <id name="key" column="id" unsaved-value="null" type="string" > <generator class="assigned" /> </id> <!-- 添加鉴别器字段,用来区分父类和子类记录 --> <discriminator column="entity_type" type="string"/> <!-- 父类的属性(对应你之前写的animal、dog) --> <property name="animal" column="animal" type="string"/> <property name="dog" column="dog" type="string"/> <!-- 配置子类 --> <subclass name="ShortHand" discriminator-value="shorthand"/> </class> </hibernate-mapping>
这种方式不需要单独的子类映射文件,只保留父类的映射即可。
方案二:Joined继承(更规范)
父类和子类分别对应不同的数据库表,子类表通过外键关联父类表。配置方式如下:
<hibernate-mapping package="cool.wxhy.tms.xyz"> <class name="LongHand" table="LongHand"> <id name="key" column="id" unsaved-value="null" type="string" > <generator class="assigned" /> </id> <!-- 父类的属性 --> <property name="animal" column="animal" type="string"/> <property name="dog" column="dog" type="string"/> </class> <!-- 子类映射,通过外键关联父类表 --> <joined-subclass name="ShortHand" table="ShortHand"> <key column="id"/> <!-- 如果ShortHand有自己的专属属性,在这里添加 --> </joined-subclass> </hibernate-mapping>
3. 确保映射文件被SessionFactory加载
检查你的hibernate.cfg.xml,确认已经添加了对应的映射文件配置,比如:
<mapping resource="cool/wxhy/tms/xyz/LongHand.hbm.xml"/>
4. 小提醒
你的代码里开启事务后没有提交,记得在sess.save(o);之后加上tx.commit();,否则数据不会真正写入数据库哦。
内容的提问来源于stack exchange,提问作者ghostrider
相关产品推荐
相关产品推荐

