【问题标题】:Invalid object name 'ACCOUNT_orders'? Spring-MVC Hibernate with annotation question对象名称“ACCOUNT_orders”无效?带有注释问题的 Spring-MVC Hibernate
【发布时间】:2011-07-23 10:20:20
【问题描述】:

我是 Hibernate 的新手。我在 DB 中有 Order 和 Account 表,

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

订单类别:

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

请帮帮我。提前致谢。

【问题讨论】:

    标签: hibernate spring spring-mvc hibernate-mapping hibernate-annotations


    【解决方案1】:

    这里有一个双向的 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");
    

    【讨论】:

    • @JB 它不起作用,它说:org.hibernate.AnnotationException:元素集合不能有 mappedBy 或关联引用未映射的实体:com.trade.model.Account.orders
    • 您是否使用 javax.persistence.Entity 注释了 Order 类?
    • 是的,两个类(Account 和 Order)都用 @Entity 注释。
    • 您确定 Entity 的导入语句是 javax.persistence.Entity,而不是 org.hibernate.annotations.Entity?
    • 实体是否在 hibernate.cfg.xml 文件中声明?如果不是这种情况,请编辑您的问题并添加新代码。
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2010-10-04
    相关资源
    最近更新 更多