2014-11-06 80 views
1

我有兩個MYSQL表:帳戶和用戶。一個用戶可以擁有多個帳戶,所以它是一對多的關係。 帳戶有以下列:id,用戶,標題,銀行,類型。它也有一個條目:休眠無法執行查詢無效的值getInt()

1 USER1檢查BANKNAME借記

用戶有列:ID,第一個,最後,用戶名,密碼。它有一個入口,以及:

約翰Doe的user1的獵頭

我所做的類和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> 

這是我的用戶類

import java.util.Set;

public class User { 
private int id; 
private String first; 
private String last; 
private String username; 
private String password; 

public User() { 
}; 

public User(String fName, String lName, String uName, String pass) { 
    this.first = fName; 
    this.last = lName; 
    this.username = uName; 
    this.password = pass; 
}; 
//getters and setters 
} 

和帳戶映射

<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> 

當我運行一些代碼來打印出所有帳戶(只有一個),

public class ManageAccount { 
private static SessionFactory factory; 

public static void main(String[] args) { 
    try { 
     factory = new Configuration().configure().buildSessionFactory(); 
    } catch (Throwable ex) { 
     System.err.println("Failed to create sessionFactory object." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 

    Session session = factory.openSession(); 
    Transaction tx = null; 
    try { 
     tx = session.beginTransaction(); 
     List accounts = session.createQuery("FROM Account").list(); 
     for (Iterator iterator = accounts.iterator(); iterator.hasNext();) { 
      Account acc = (Account) iterator.next(); 
      // System.out.print("First Name: " + acc.getUser().getFirst()); 
      System.out.print(" Last Name: " + acc.getName()); 
      System.out.println(" Salary: " + acc.getType()); 
     } 
     tx.commit(); 
    } catch (HibernateException e) { 
     if (tx != null) 
      tx.rollback(); 
     e.printStackTrace(); 
    } finally { 
     session.close(); 
    } 
} 

我得到這個錯誤

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

我不明白爲什麼它會使用ge tInt(),它顯然是一個String或Class。

回答

1

的問題是由於以下映射

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

什麼它實際上說的是,帳戶實體使用的外鍵的列用戶映射爲一個關係的許多部分,一個用戶帳戶表。 但是用戶的主鍵爲int

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

而從示例數據推斷在帳戶中的用戶列清楚地是用戶名(即字符串)。

你可以做的是使用用戶ID(INT)作爲賬戶表的外鍵,而不是用戶名

+0

你的評估是不正確的。在多對一的情況下,名稱值必須與Java類中相應的字段名稱匹配。列值將是數據庫中的列名稱。 Hibernate將自動使用主鍵作爲外鍵關聯。 – markbernard 2014-11-07 14:36:32

+0

您指的是JPA註釋。這裏是休眠xml配置 – grid 2014-11-07 14:44:28

+0

在我的工作中,我們也使用XML,因爲我們僅限於我們可以使用的Hibernate版本。我的聲明是指XML配置。您需要定位Java字段名稱,以便Hibernate知道如何創建每個對象並正確連接它們。 Hibernate默認連接主鍵上的表。 – markbernard 2014-11-07 15:23:42

0

在查詢中聯接表時我就遇到了這個問題。 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>