1

我是Hibernate的新手。我有訂單和客戶表中DB,無效的對象名稱'ACCOUNT_orders'? Spring-MVC Hibernate with annotation question

CREATE TABLE [dbo].[ORDERS](
    [PRICE] [decimal](12, 2) NULL, 
    [ORDERID] [int] IDENTITY(0,1) NOT NULL, 
    [ACCOUNT_ACCOUNTID] [int] NULL, 
CONSTRAINT [PK_ORDER] PRIMARY KEY CLUSTERED 
(
    [ORDERID] ASC 
)WITH ( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) 
) 

帳戶表:

CREATE TABLE [dbo].[ACCOUNT](
    [BALANCE] [decimal](12, 2) NULL, 
    [ACCOUNTID] [int] IDENTITY(0,1) NOT NULL, 
    [PROFILE_USERID] [varchar](250) NULL, 
CONSTRAINT [PK_ACCOUNT] PRIMARY KEY CLUSTERED 
(
    [ACCOUNTID] ASC 
)WITH ( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) 
) 

我試圖做一對多映射的一個帳戶有許多訂單。我有以下類:

@Table(name="ACCOUNT") 
public class Account implements Serializable, IEntity{ 

    private static final long serialVersionUID = 1L; 
    private int accountID; 
    private double balance; 
    private List<Order> orders; 

    @Id 
    @GeneratedValue 
    public int getAccountID() { 
     return accountID; 
    } 
public void setAccountID(int accountID) { 
    this.accountID = accountID; 
} 

public double getBalance() { 
    return balance; 
} 
public void setBalance(double balance) { 
    this.balance = balance; 
} 

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
@JoinColumn(name = "ACCOUNT_ACCOUNTID",nullable=false,insertable=true,updatable=true) 
public List<Order> getOrders() 
{ 
    return orders; 
} 
public void setOrders(List<Order> orders) 
    { 
     this.orders = orders; 
    }  
} 

Order類:

@Table(name="ORDERS") 
public class Order implements Serializable, IEntity 
{ 
    private int orderID; 
    private double price; 
    @Column(name="ACCOUNT_ACCOUNTID") 
    private Account account; 

    @Id 
    @GeneratedValue 
    public int getOrderID() { 
    return orderID; 
} 
public void setOrderID(int orderID) { 
    this.orderID = orderID; 
} 
public double getPrice() { 
    return price; 
} 
public void setPrice(double price) { 
    this.price = price; 
} 

@ManyToOne(cascade = CascadeType.ALL ,fetch = FetchType.EAGER) 
public Account getAccount() { 
     return account; 
    } 
    public void setAccount(Account account) { 
     this.account = account; 
    } 
} 

但是,當我嘗試訪問的HibernateTemplate列表方法與以下HQL:

SQL_QUERY =" from Account as a where a.balance='"+bal+"'"; 

它給了我以下ecxeption:

(JDBCExceptionReporter.java:72) - Invalid object name 'ACCOUNT_orders'. 

java.lang.NullPointerException 
    at com.microsoft.trade.service.TradeServiceImplementor.loginVerify(TradeServiceImplementor.java:59) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 

請幫我。提前致謝。

回答

2

這裏有一個雙向OneToMany關聯:一個帳戶有很多訂單,而一個訂單有一個帳戶。其中一個關聯是另一個關係的逆轉。因此,您必須在一側定義此關聯的映射(通常,多方面:由JPA強制執行),並聲明關聯是另一側(另一側)的相反關係:

@Entity 
public class Account implements Serializable, IEntity{ 
    // ... 
    private List<Order> orders; 

    // mappedBy is used to indicate that this association is the inverse of the association 
    // mapped by the account property of the Order entity 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="account") 
    public List<Order> getOrders() { 
     return orders; 
    }  
} 

@Entity 
public class Order implements Serializable, IEntity { 
    // ... 
    // a relationship to another entity is never mapped by @Column. You can't have annotations 
    // on the field and the getter. Choose one or the other, and be consistent for all 
    // the properties of the entity 
    private Account account; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "ACCOUNT_ACCOUNTID") 
    public Account getAccount() { 
     return account; 
    } 
} 

請注意,大多數情況下,在關係的多方都有級聯是錯誤的。你不想在訂單時刪除一個賬戶,是嗎?賬戶持有訂單,而不是相反。

最後,關於您的查詢:它不是SQL查詢,它是HQL查詢。你不應該使用串聯,但參數綁定:這是更安全(無注入攻擊),更清晰的(沒有引號必要,更具可讀性)和更快:

String hql = "from Account a where a.balance = :theBalance"; 
Query query = session.createQuery(); 
query.setParameter("theBalance", new BigDecimal("12.5"); 
+0

@JB它不工作,它說:組織。 hibernate.AnnotationException:元素的集合不能有mappedBy或關聯引用一個未映射的實體:com.trade.model.Account.orders – Sagar 2011-03-26 11:19:05

+0

您是否使用javax.persistence.Entity註釋了Order類? – 2011-03-26 11:32:42

+0

是這兩個類(帳戶和訂單)都用@Entity註釋。 – Sagar 2011-03-26 11:40:34