Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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无法执行getInt()的查询无效值_Java_Hibernate_Jakarta Ee - Fatal编程技术网

Java Hibernate无法执行getInt()的查询无效值

Java Hibernate无法执行getInt()的查询无效值,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,我有两个MYSQL表:Account和User。一个用户可以有多个帐户,因此是一对多关系。 帐户有以下列:id、用户、标题、银行、类型。它还有一个条目: 1用户1检查银行名称借方 用户有以下列:id、first、last、username、password。它还有一个条目: 1无名氏用户1猎人2 我已经为每个类创建了类和hibernate映射: public class Account { private int id; private User user; priva

我有两个MYSQL表:Account和User。一个用户可以有多个帐户,因此是一对多关系。 帐户有以下列:id、用户、标题、银行、类型。它还有一个条目:

1用户1检查银行名称借方

用户有以下列:id、first、last、username、password。它还有一个条目:

1无名氏用户1猎人2

我已经为每个类创建了类和hibernate映射:

public class Account {

    private int id;
    private User user;
    private String title;
    private String bank;
    private String type;
    private double amount;

    public Account() {
    }

    public Account(User usr, String nm, String bnk, String typ) {
         this.user = usr;
        this.name = ttl;
        this.bank = bnk;
        this.type = typ;
    }
    //getters and setters
 }
这是我的地图

<class name="com.package.dao.beans.Account" table="budgeting.ACCOUNT">
    <meta attribute="class-description">
        This class contains the account detail.
    </meta>
    <id name="id" type="int" column="id">
        <generator class="native" />
    </id>
    <many-to-one name="user" class="com.package.dao.beans.User"
        column="user" unique="true" not-null="true"/>
    <property name="title" column="title" type="string" />
    <property name="bank" column="bank" type="string" />
    <property name="type" column="type" type="string" />

</class>
和帐户映射

    <class name="com.package.dao.beans.User" table="budgeting.users">
    <meta attribute="class-description">
        This class contains the account detail.
    </meta>
    <id name="id" type="int" column="id">
        <generator class="native" />
    </id>
    <property name="first" column="first" type="string" />
    <property name="last" column="last" type="string" />
    <property name="username" column="username" type="string" />
    <property name="password" column="password" type="string" />
</class>
我得到这个错误

org.hibernate.exception.GenericJDBCException: could not execute query
Caused by: java.sql.SQLException: Invalid value for getInt() - 'user1'

我不明白为什么它会使用getInt(),它显然是一个字符串或类。

问题是由于以下映射

<many-to-one name="user" class="com.package.dao.beans.User"
        column="user" unique="true" not-null="true"/>

它实际上说的是,Account实体作为关系的多个部分映射到一个用户,使用Account表的列用户作为外键。 但用户的主键是int

    <id name="id" type="int" column="id">
        <generator class="native" />
    </id>

而根据示例数据推断的帐户中的用户列显然是用户名(即字符串)


您可以使用用户id(int)作为Account表中的外键,而不是用户名,我在查询中连接表时遇到了这个问题。Hibernate无法将列正确映射到正确的字段,因为我有重复的名称。在Java类中,这是可以的,但是您应该确保每个列名都是唯一的,特别是当您要连接表时。下面是我要做的:

<class name="com.package.dao.beans.Account" table="budgeting.ACCOUNT">
    <meta attribute="class-description">
        This class contains the account detail.
    </meta>
    <id name="id" type="int" column="account_id"> // ***** change here
        <generator class="native" />
    </id>
    <many-to-one name="user" class="com.package.dao.beans.User"
        column="account_user_id" unique="true" not-null="true"/> // ***** change here
    <property name="title" column="title" type="string" />
    <property name="bank" column="bank" type="string" />
    <property name="type" column="type" type="string" />

</class>

<class name="com.package.dao.beans.User" table="budgeting.users">
    <meta attribute="class-description">
        This class contains the account detail.
    </meta>
    <id name="id" type="int" column="user_id">  // ***** change here
        <generator class="native" />
    </id>
    <property name="first" column="first" type="string" />
    <property name="last" column="last" type="string" />
    <property name="username" column="username" type="string" />
    <property name="password" column="password" type="string" />
</class>

此类包含帐户详细信息。
//******在这里换车
//******在这里换车
此类包含帐户详细信息。
//******在这里换车

您的评估不正确。在多对一模式中,name值必须与Java类中相应的字段名匹配,它确实如此。列值将是数据库中的列名。Hibernate将自动使用主键作为外键关联。您指的是JPA注释。这里是hibernate xml配置在我的工作中,我们也使用xml,因为我们只能使用hibernate的版本。我的发言是指XML配置。您需要以Java字段名为目标,以便Hibernate知道如何创建每个对象并正确连接它们。默认情况下,Hibernate连接主键上的表。正确。然而,我仍然看不出我的评估有什么问题。账表中给定的列名为:id、user、title、bank、type和对应的值:1 user1 Checking BankName Debit,这清楚地表明列user是字符串。hibernate试图与int PK关联,很抱歉你是对的。看起来它是在用户名列而不是id列上加入的。在我们的代码中,Hibernate总是在主键上加入。也许是他做了什么导致了这个问题。
    <id name="id" type="int" column="id">
        <generator class="native" />
    </id>
<class name="com.package.dao.beans.Account" table="budgeting.ACCOUNT">
    <meta attribute="class-description">
        This class contains the account detail.
    </meta>
    <id name="id" type="int" column="account_id"> // ***** change here
        <generator class="native" />
    </id>
    <many-to-one name="user" class="com.package.dao.beans.User"
        column="account_user_id" unique="true" not-null="true"/> // ***** change here
    <property name="title" column="title" type="string" />
    <property name="bank" column="bank" type="string" />
    <property name="type" column="type" type="string" />

</class>

<class name="com.package.dao.beans.User" table="budgeting.users">
    <meta attribute="class-description">
        This class contains the account detail.
    </meta>
    <id name="id" type="int" column="user_id">  // ***** change here
        <generator class="native" />
    </id>
    <property name="first" column="first" type="string" />
    <property name="last" column="last" type="string" />
    <property name="username" column="username" type="string" />
    <property name="password" column="password" type="string" />
</class>