问题描述:

    针对这个问题,发表一下我的观点。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定义了一次表关系重复定义了。

解决思路:

我在之前做过的审计项目中,数据库中有些表也是仅仅设置了主键,他们之间的关系也只是在注解中体现了。如有问题,烦请斧正;