【问题标题】:JPA with OpenJPA gives ArgumentException带有 OpenJPA 的 JPA 给出 ArgumentException
【发布时间】:2016-02-11 04:28:07
【问题描述】:

下面是我的豆

package com.dunkul.stateless;

import javax.ejb.Stateless;

import com.dunkul.entity.Book;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {

   public LibraryPersistentBean(){
   }

   @PersistenceContext(unitName="EjbComponentPU")
   private EntityManager entityManager;         

   public void addBook(Book book) {
      entityManager.persist(book);
   }    

   public List<Book> getBooks() {
      return entityManager.createQuery("From Book").getResultList();
   }
}

//---------------------------------------------------------------------


package com.dunkul.stateless;

import javax.ejb.Remote;

import com.dunkul.entity.Book;
import java.util.List;

@Remote
public interface LibraryPersistentBeanRemote {

   void addBook(Book bookName);

   List<Book> getBooks();

}

//----------------------------------------------------------

实体类

package com.dunkul.entity;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="books")
public class Book implements Serializable{

   private int id;
   private String name;

   public Book(){        
   }

   @Id
   @GeneratedValue(strategy= GenerationType.IDENTITY)
   @Column(name="id")
   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }    
}

//-------------------------------------------------

persistance.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.0">

    <persistence-unit name="EjbComponentPU" transaction-type="JTA">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>TestDS</jta-data-source>
        <class>com.dunkul.entity.Book</class>
    </persistence-unit>
 </persistence>


//--------------------------------------------------------------

客户端.java

    package com.dunkul.client;

    import java.util.Hashtable;
    import java.util.Iterator;
    import java.util.List;

    import javax.naming.Context;
    import javax.naming.InitialContext;

    import com.dunkul.entity.Book;
    import com.dunkul.stateless.LibraryPersistentBeanRemote;;



    public class ClientEJB {

        LibraryPersistentBeanRemote lib;
        public static void main(String[] args) throws Exception {
            new ClientEJB().callEjb();
        }
        private void callEjb() throws Exception {
            // TODO Auto-generated method stub
            Hashtable<String, String> ctxProps = new Hashtable<String, String>();
            ctxProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
            ctxProps.put(Context.PROVIDER_URL, "http://localhost:8082/tomee/ejb");
            ctxProps.put(Context.URL_PKG_PREFIXES,"org.apache.naming");
            ctxProps.put("openejb.descriptors.output", "true");
            InitialContext context = new InitialContext(ctxProps);
            lib = (LibraryPersistentBeanRemote)context.lookup("LibraryPersistentBeanRemote");
            String bookName = "Sonali";

            Book newBook = new Book();
        //  newBook.setId(1);
        //  newBook.setName(bookName);
        //  lib.addBook(newBook);

            List ls = lib.getBooks();
            for (Iterator iterator = ls.iterator(); iterator.hasNext();) {
                Object object = (Object) iterator.next();
                System.out.println((String)object);

            }

        }

    }

I am getting following error

严重:EjbTransactionUtil.handleSystemException:“在字符 1 处遇到“From”,但预期为:[“DELETE”、“SELECT”、“UPDATE”]。”在解析 JPQL “From Book”时。请参阅嵌套堆栈跟踪 原始解析错误。 org.apache.openjpa.persistence.ArgumentException:“在字符 1 处遇到“From”,但预期:[“DELETE”、“SELECT”、“UPDATE”]。”尽管 解析JPQL“来自书”。请参阅嵌套堆栈跟踪以了解原始解析错误。

【问题讨论】:

    标签: jpa ejb openjpa apache-tomee


    【解决方案1】:
    "From Book"
    

    无效 JPQL(JPA 提供的查询语言)。

    您使用的语法是“Hibernate HQL”,对 JPA 无效。不用说,Hibernate 文档并没有做出太多努力来明确这一点,许多使用过 Hibernate 的人认为这个 HQL 是所有 JPA 实现都应该支持的。

    兼容的 JPA 实现(例如 OpenJPA)使用 JPQL(任何像样的 JPA 教程都会说)。有效的 JPQL 类似于

    SELECT b FROM Book b
    

    【讨论】:

    • 我已经像下面这样修改了客户端
    • 我修改了代码以删除 JPQL 调用并仅保留以下内容。预订新书 = 新书(); newBook.setId(10); newBook.setName(书名); lib.addBook(新书);我得到了新的例外。 <1674604>
    猜你喜欢
    • 2011-04-10
    • 2014-04-28
    • 2018-09-05
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多