2013-12-23 47 views
3

我有以下实体映射:为什么我的多级继承映射不​​能像我期望的那样工作?

// user.cfc 
component persistent="true" table="user" discriminatorColumn="userTypeID" { 

    property name="id" column="userID" fieldtype="id" generator="identity"; 
    property name="type" fieldtype="many-to-one" cfc="userType" fkcolumn="userTypeID"; 

} 

// admin.cfc 
component extends="user" persistent="true" table="admin" joincolumn="userID" discriminatorValue="3" { 

    property name="id" column="adminID" fieldtype="id" generator="identity"; 

} 

// employee.cfc 
component extends="user" persistent="true" table="employee" joincolumn="userID" discriminatorValue="0" { 

    property name="id" column="employeeID" fieldtype="id" generator="identity"; 

} 

// manager.cfc 
component extends="employee" persistent="true" table="manager" joincolumn="employeeID" discriminatorValue="1" { 

    property name="id" column="managerID" fieldtype="id" generator="identity"; 

} 

// intern.cfc 
component extends="employee" persistent="true" table="intern" joincolumn="employeeID" discriminatorValue="2" { 

    property name="id" column="internID" fieldtype="id" generator="identity"; 

} 

每亨利的建议,这里是产生hbmxml文件:

<!-- user.hbmxml --> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class entity-name="user" lazy="true" 
     name="cfc:user" table="user"> 
     <id name="ID" type="int"> 
      <column name="userID"/> 
      <generator class="identity"/> 
     </id> 
     <discriminator column="userTypeID"/> 
     <many-to-one class="cfc:userType" 
      column="userTypeID" insert="false" name="type" update="false"/> 
    </class> 
</hibernate-mapping> 


<!-- admin.hbmxml --> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <subclass discriminator-value="3" entity-name="admin" 
     extends="cfc:user" lazy="true" name="cfc:admin"> 
     <join table="admin"> 
      <key column="userID"/> 
     </join> 
    </subclass> 
</hibernate-mapping> 


<!-- employee.hbmxml --> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <subclass discriminator-value="0" entity-name="employee" 
     extends="cfc:user" lazy="true" name="cfc:employee"> 
     <join table="employee"> 
      <key column="userID"/> 
     </join> 
    </subclass> 
</hibernate-mapping> 


<!-- manager.hbmxml --> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <subclass discriminator-value="1" entity-name="manager" 
     extends="cfc:employee" lazy="true" name="cfc:manager"> 
     <join table="manager"> 
      <key column="employeeID"/> 
     </join> 
    </subclass> 
</hibernate-mapping> 


<!-- intern.hbmxml --> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <subclass discriminator-value="2" entity-name="intern" 
     extends="cfc:employee" lazy="true" name="cfc:intern"> 
     <join table="intern"> 
      <key column="employeeID"/> 
     </join> 
    </subclass> 
</hibernate-mapping> 

如果不是从映射清晰,关系如下:

user 
|- admin 
|- employee 
    |- manager 
    |- intern 

意图是对user实体上的type属性进行填充managerintern实体的鉴别器值。 employee的构造函数中存在代码,使其不能直接实例化,所以user将始终有一个type

从数据库读取一些已经存在的数据时,整个映射工作正常。但是,当我试图插入新记录时遇到问题。

假设已经涉及到的表有一些记录填充:

user 
|---------------------| 
| userID | userTypeID | 
|---------------------| 
| 1  | 1   | 
| 2  | 2   | 
| 3  | 2   | 
| 4  | 3   | 
|---------------------| 

admin 
|------------------| 
| adminID | userID | 
|------------------| 
| 1  | 4  | 
|------------------| 

employee 
|---------------------| 
| employeeID | userID | 
|---------------------| 
| 1   | 1  | 
| 2   | 2  | 
| 3   | 3  | 
|---------------------| 

manager 
|------------------------| 
| managerID | employeeID | 
|------------------------| 
| 1   | 1   | 
|------------------------| 

intern 
|-----------------------| 
| internID | employeeID | 
|-----------------------| 
| 1  | 2   | 
| 2  | 3   | 
|-----------------------| 

如果我要创建一个新的intern实体和坚持它,我希望要插入三个记录:

INSERT user (userID, userTypeID) VALUES (5, 2) 
INSERT employee (employeeID, userID) VALUES (4, 5) 
INSERT intern (internID, employeeID) VALUES (3, 4) 

但是,实际执行的SQL如下所示:

INSERT user (userID, userTypeID) VALUES (5, 2) 
INSERT employee (employeeID, userID) VALUES (4, 5) 
INSERT intern (internID, employeeID) VALUES (3, 5) -- using the new userID instead of the new employeeID 

最后,实际问题:

为什么在插入到intern时,是使用userID而不是employeeID?就好像Hibernate忽略intern上的joincolumn属性并仅使用employee中的joincolumn

+0

为了让hibernate的人帮助你,你可能要考虑发布'.hbxml'生成的CF。 – Henry

+0

@亨利 - 好主意,补充。 –

+0

我可能是错的,但我相信这就是休眠的工作原理。他们有这个背后的原因。所以要么喝酒,要留下他们给你的东西,或者简化你的设计。 – Henry

回答

0

Hibernate将使用User表中的discriminatorColumn构造一个“intern”对象,以便它使用userID而不是employeeID。

相关问题