Java Hibernate无法执行getInt()的查询无效值
我有两个MYSQL表:Account和User。一个用户可以有多个帐户,因此是一对多关系。 帐户有以下列:id、用户、标题、银行、类型。它还有一个条目: 1用户1检查银行名称借方 用户有以下列:id、first、last、username、password。它还有一个条目: 1无名氏用户1猎人2 我已经为每个类创建了类和hibernate映射: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
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>