He estado jugando con un ejemplo de JPA muy simple y estoy tratando de ajustarlo a una base de datos existente. Pero no puedo superar este error. (Abajo). Simplemente tiene que ser algo simple que no estoy viendo.Asignación de JPA: "QuerySyntaxException: foobar no está correlacionado ..."
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)
En la clase DocumentManager a continuación (un simple servlet, ya que es mi meta objetivo) hace dos cosas:
- insertar una fila
- devolver todas las filas
El la inserción funciona perfectamente, todo está bien allí. El problema es con la recuperación. He intentado todo tipo de valores para los parámetros Query q = entityManager.createQuery
, pero no tuve suerte, y he intentado varias anotaciones más explicadas de la clase (como los tipos de columna), todo sin éxito.
Por favor, sálvame de mí mismo. Estoy seguro de que es algo pequeño. Mi inexperiencia con JPA me impide ir más lejos. archivo
Mi ./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
}
Mi clase ./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();
}
}
El Tomcat {}-hogar /webapps/ROOT/WEB-INF/classes/METE-INF/persistance.xml presentar
<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>
La descripción de la tabla 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)
Entonces, ¿al nombre de la clase y no al nombre de la tabla? –
Sí.Aunque parece sql, tu lenguaje de consulta JPA en ejecución; entonces estás seleccionando desde Entidades, no desde tablas. – Chris
*** Eres mi héroe para el mes de diciembre de 2011. *** Gracias. He volado más de una hora en esto ... –