2

私は休止状態が初めてです。DBに注文とアカウントのテーブルがあり、

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

1 つのアカウントに多くの注文がある 1 対多のマッピングを実行しようとしています。私は次のクラスを持っています:

@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;
    }       
}

注文クラス:

@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;
    }  
}

しかし、次の HQL を使用して HibernateTemplate の List メソッドにアクセスしようとすると:

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

それは私に次の例外を与えます:

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

お願い助けて。前もって感謝します。

4

1 に答える 1

2

ここには双方向の OneToMany 関連付けがあります。アカウントには多くの注文があり、注文には 1 つのアカウントがあります。関連付けの 1 つは、もう一方の逆です。したがって、一方の側 (通常は多側: これは 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");
于 2011-03-26T10:51:40.680 に答える