问题描述:
针对这个问题,发表一下我的观点。emp表和dept表使用hibernate关联查询时报的错,使用的是非注解形式,和其他一样。他们各自有entity,各自有一个hbm.xml文件,emp表这边配置多对一,dept表这边在set或者list中配置一对多。
consol报错截图如下:
代码片段:
部门entity
public class Dept { private Set<Emp> emps = new HashSet<Emp>(); set/get方法... }
部门hbm.xml
<hibernate-mapping package="com.cissst.it.dept.entity"> <class name="Dept" table="DEPT"> <id name="deptno" column="DEPTNO"> <generator class="native"></generator> </id> <property name="dname" column="DNAME"></property> <set name="emps" inverse="true"> <key column="deptno"></key> <one-to-many class="com.cissst.it.emp.entity.Emp"/> </set> </class> </hibernate-mapping>
员工entity
public class Emp { //所属部门 private Dept dept; set/get方法... }
员工.hbm.xml
<hibernate-mapping package="com.cissst.it.emp.entity"> <class name="Emp" table="EMP"> <id name="empno" column="EMPNO"> <generator class="native"></generator> </id> <property name="ename" column="ENAME"></property> <property name="job" column="JOB"></property> <many-to-one name="dept" class="com.cissst.it.dept.entity.Dept"/> </class> </hibernate-mapping>
执行报错的方法:
Session session = SessionUtil.openSession(); Dept dept = session.get(Dept.class, 10); System.out.println(dept);
问题分析:
根据错误提示,估计是两个实体类关系重复定义了,于是我复制了emp表和dept,复制后得到emp1和dept1,然后对emp1和dept1设置了主键,没有设置外键,结果运行正常。这说明数据库中的外键定义了一次2个表关系 和 hbm定义了一次表关系重复定义了。
解决思路:
我在之前做过的审计项目中,数据库中有些表也是仅仅设置了主键,他们之间的关系也只是在注解中体现了。如有问题,烦请斧正;
Best Regards