如何阻止Hibernate切换构造函数参数?

时间:2014-08-01 14:54:59

标签: java hibernate

假设我在多对多中有三个表:user,group和user_in_group。多对多的结构是:

user_id BIGINT
group_id BIGINT
generate_table TINYINT

哪个应该导致:

public UserInGroup(UserInGroupId id = new UserInGroupId(user_id, group_id), 
    User user, 
    Group group, 
    boolean generateTable)

但相反,它会导致:

public UserInGroup(UserInGroupId id = new UserInGroupId(user_id, group_id), 
    Group group, 
    User user, 
    boolean generateTable)

我认为可能是组的外键是在用户的外键之前创建的,但是我交换了外键并没有区别。

这是我的UserInGroup.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Aug 1, 2014 10:06:06 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.my.project.UserInGroup" table="user_in_group" catalog="project">
        <composite-id name="id" class="com.my.project.UserInGroupId">
            <key-property name="UserId" type="long">
                <column name="user_id" />
            </key-property>
            <key-property name="GroupId" type="long">
                <column name="group_id" />
            </key-property>
        </composite-id>
        <many-to-one name="Group" class="com.my.project.Group" update="false" insert="false" fetch="select">
            <column name="group_id" not-null="true" />
        </many-to-one>
        <many-to-one name="User" class="com.my.project.User" update="false" insert="false" fetch="select">
            <column name="user_id" not-null="true" />
        </many-to-one>
        <property name="generateTable" type="boolean">
            <column name="generate_table" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

1 个答案:

答案 0 :(得分:0)

生成的构造函数中的属性顺序对应于XML Mapping中的属性顺序。

在复合键的映射中,userId是第一个,然后是groupId。因此,你得到new UserInGroupId(user_id, group_id)。对于多对一参考,反之亦然 - 首先说明对集团的引用,然后是对用户的引用。

您只需更改XML并切换多对一引用的顺序:

<many-to-one name="User" class="com.my.project.User" update="false" insert="false" fetch="select">
    <column name="user_id" not-null="true" />
</many-to-one>
<many-to-one name="Group" class="com.my.project.Group" update="false" insert="false" fetch="select">
    <column name="group_id" not-null="true" />
</many-to-one>

由于XML是从反向生成生成的,因此反向生成器的数据库可能按照您在生成的XML中看到的顺序返回两个外键。如果您不想手动更改XML,则应检查是否可以修改源数据库以按所需顺序返回列。