2011-11-22 7 views
45

मैं एक बहुत ही सरल जेपीए उदाहरण के साथ खेल रहा हूं और इसे मौजूदा डेटाबेस में बदलने की कोशिश कर रहा हूं। लेकिन मैं इस त्रुटि को दूर नहीं कर सकता। (नीचे।) यह सिर्फ कुछ साधारण चीज होनी चाहिए जो मैं नहीं देख रहा हूं।जेपीए मैपिंग: "क्वेरी सिंटैक्स अपवाद: foobar मैप नहीं किया गया है ..."

org.hibernate.hql.internal.ast.QuerySyntaxException: FooBar is not mapped [SELECT r FROM FooBar r] 
    org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180) 
    org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110) 
    org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93) 

नीचे DocumentManager कक्षा में (एक सरल सर्वलेट, कि के रूप में अपने लक्ष्य लक्ष्य है) दो बातें करता है:

  1. एक पंक्ति सम्मिलित
  2. वापसी सभी पंक्तियों

सम्मिलन पूरी तरह से काम करता है - सब वहाँ अच्छा है। समस्या पुनर्प्राप्ति के साथ है। मैंने Query q = entityManager.createQuery पैरामीटर के लिए सभी प्रकार के मानों का प्रयास किया है, लेकिन कोई किस्मत नहीं है, और मैंने सफलता के बिना कक्षा (जैसे स्तंभ प्रकार) की विभिन्न व्याख्याओं की व्याख्या की है।

कृपया मुझे अपने से बचाएं। मुझे यकीन है कि यह कुछ छोटा है। जेपीए के साथ मेरा अनुभवहीनता मुझे किसी भी आगे जाने से रोक रहा है।

मेरे ./src/ch/geekomatic/jpa/FooBar.java फ़ाइल:

@Entity 
@Table(name = "foobar") 
public class FooBar { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="id") 
    private int id; 

    @Column(name="rcpt_who") 
    private String rcpt_who; 

    @Column(name="rcpt_what") 
    private String rcpt_what; 

    @Column(name="rcpt_where") 
    private String rcpt_where; 

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

    public String getRcpt_who() { 
     return rcpt_who; 
    } 
    public void setRcpt_who(String rcpt_who) { 
     this.rcpt_who = rcpt_who; 
    } 

    //snip...the other getters/setters are here 
} 

मेरे ./src/ch/geekomatic/jpa/DocumentManager.java वर्ग

public class DocumentManager extends HttpServlet { 
    private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ch.geekomatic.jpa"); 

    protected void tearDown() throws Exception { 
     entityManagerFactory.close(); 
    } 

    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
     FooBar document = new FooBar(); 
     document.setRcpt_what("my what"); 
     document.setRcpt_who("my who"); 

     persist(document); 

     retrieveAll(response); 
    } 

    public void persist(FooBar document) { 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     entityManager.getTransaction().begin(); 
     entityManager.persist(document); 
     entityManager.getTransaction().commit(); 
     entityManager.close(); 
    } 

    public void retrieveAll(HttpServletResponse response) throws IOException { 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     entityManager.getTransaction().begin(); 

     // *** PROBLEM LINE *** 
     Query q = entityManager.createQuery("SELECT r FROM foobar r", FooBar.class); 
     List<FooBar> result = q.getResultList(); 

     for (FooBar doc : result) { 
      response.getOutputStream().write(event.toString().getBytes()); 
      System.out.println("Document " + doc.getId() ); 
     } 
     entityManager.getTransaction().commit(); 
     entityManager.close(); 
    } 
} 

{बिल्ला-घर} /webapps/ROOT/WEB-INF/classes/METE-INF/persistance.xml फ़ाइल

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

<persistence-unit name="ch.geekomatic.jpa"> 
    <description>test stuff for dc</description> 

    <class>ch.geekomatic.jpa.FooBar</class> 

    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url"  value="jdbc:mysql://svr:3306/test" /> 
     <property name="javax.persistence.jdbc.user"  value="wafflesAreYummie" /> 
     <property name="javax.persistence.jdbc.password" value="poniesRock" /> 

     <property name="hibernate.show_sql"  value="true" /> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
    </properties> 

</persistence-unit> 
</persistence> 

MySQL तालिका विवरण:

mysql> describe foobar; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| rcpt_what | varchar(255) | YES |  | NULL |    | 
| rcpt_where | varchar(255) | YES |  | NULL |    | 
| rcpt_who | varchar(255) | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
4 rows in set (0.00 sec) 

उत्तर

120

JPQL ज्यादातर केस-संवेदी है। केस-सेंसिटिव चीजों में से एक जावा इकाई नाम है। अपनी क्वेरी को यहां बदलें:

"SELECT r FROM FooBar r" 
+3

तो, कक्षा के नाम पर और तालिका का नाम नहीं? –

+27

हां।हालांकि यह एसक्यूएल की तरह दिखता है, आपका निष्पादन जेपीए क्वेरी भाषा; इसलिए आप टेबल से नहीं, संस्थाओं से चयन कर रहे हैं। – Chris

+11

*** आप दिसंबर, 2011 के महीने के लिए मेरे हीरो हैं। *** धन्यवाद। मैंने इस पर एक घंटे से अधिक उड़ा दिया है ... –

14

इस त्रुटि का एक और संभावित स्रोत भी है। कुछ J2EE/वेब कंटेनर (Jboss 7.x और बिलाव 7.x के तहत मेरे अनुभव में) में आप प्रत्येक वर्ग आप

के रूप में एक फ़ाइल में इकाई हाइबरनेट persistence.xml के रूप में उपयोग करना चाहते हैं जोड़ने के लिए <class>com.yourCompanyName.WhateverEntityClass</class>

जेबॉस के मामले में यह प्रत्येक इकाई वर्ग (स्थानीय - यानी परियोजना के भीतर आप या पुस्तकालय में) के बारे में चिंतित हैं। टॉमकैट 7.x के मामले में यह पुस्तकालयों के भीतर केवल इकाई वर्गों से संबंधित है।

3

आप अपने क्लास के रूप में घोषित किया है:

@Table(name = "foobar") 
public class FooBar { 

आप खोज के लिए वर्ग नाम लिखने के लिए की जरूरत है।
FooBar

संबंधित मुद्दे