Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何阻止Hibernate切换构造函数参数?_Java_Hibernate - Fatal编程技术网

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

Java 如何阻止Hibernate切换构造函数参数?,java,hibernate,Java,Hibernate,假设我在多对多中有三个表:user、group和user\u in\u 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)

假设我在多对多中有三个表:user、group和user\u in\u 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>

生成的构造函数中属性的顺序与XML映射中属性的顺序相对应

在复合键的映射中,userId是第一个,然后是groupId。因此,您将获得新的UserInGroupId(user\u id,group\u 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,则应检查是否可以修改源数据库以按所需顺序返回列。

那么显示的代码是由Hibernate生成的?那么映射的定义在哪里?你使用XML吗?你能展示你的映射吗?那是UserInGroup.hbm.xml吗?哦,我应该提到我每次生成代码时都在进行反向工程。我添加了反向工程生成的hbm xml。