QuerySyntaxException is not mapped (RCP)

algebraiker

Aktives Mitglied
Hi,

mal wieder ein solches Problem und ich weiß nicht, warum es nicht funktioniert.

Ich habe eine Klasse ArticleEditor geschrieben, die von EditorPart erbt. Der Editor öffnet sich auch neben der View. Die View stellt die Datensätze, die aus meiner Datenbank mittels Hibernate geholt werden, dar. (Das passiert in einer Klasse ModelProvider). Soweit so gut.

Bei einem Doppelklick in eine Zeile in der View, öffnet sich der Editor, mit dem ich den bestehenden Datensatz in der Tabelle updaten möchte.

yqi6z.png


Dazu habe ich in der Klasse ArticleEditor folgendes gemacht:

Java:
@Override
	public void createPartControl(Composite parent) {
		GridLayout layout = new GridLayout();
		layout.numColumns = 2;
		parent.setLayout(layout);
		Label label1 = new Label(parent, SWT.NONE);
		label1.setText("Artikelname");
		text = new Text(parent, SWT.BORDER);
		text.setText(article.getName());
		text.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
		new Label(parent, SWT.NONE).setText("Artikelpreis");
		lprice = new Text(parent, SWT.BORDER);
		lprice.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
		lprice.setText("" + article.getPrice());
		Button button = new Button(parent, SWT.PUSH);
		button.setText("Update Artikel");
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				
				EntityManagerFactory emf = Persistence
						.createEntityManagerFactory("adp");

				EntityManager em = emf.createEntityManager();
				EntityTransaction tx = em.getTransaction();

				tx.begin();
				Query q = em.createQuery("update article a "
						+ "SET a.name=:name, a.price=:price "
						+ "WHERE a.number = :number");
				
				q.setParameter("name", text.getText());
				q.setParameter("price",Float.parseFloat(lprice.getText()));
				q.setParameter("number", article.getNumber());
				q.executeUpdate();
				tx.commit();
			}
		});
	}

Debugging hat ergeben, dass diese Parameter korrekt geholt werden:

Java:
q.setParameter("name", text.getText());
				q.setParameter("price",Float.parseFloat(lprice.getText()));
				q.setParameter("number", article.getNumber());

Nun bekomme ich folgende Exception:

Code:
!ENTRY org.eclipse.ui 4 0 2011-10-21 13:14:34.413
!MESSAGE Unhandled event loop exception
!STACK 0
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: article is not mapped [update article a SET a.name=:name, a.price=:price WHERE a.number = :number]
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1334)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1280)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:283)
	at toolgui.ArticleEditor$1.widgetSelected(ArticleEditor.java:87)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at toolgui.Application.start(Application.java:20)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: article is not mapped [update article a SET a.name=:name, a.price=:price WHERE a.number = :number]
	at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:178)
	at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
	at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:92)
	at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:324)
	at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3252)
	at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3141)
	at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:694)
	at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.updateStatement(HqlSqlBaseWalker.java:351)
	at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:243)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
	at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
	at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:120)
	at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214)
	at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192)
	at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1538)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:280)
	... 27 more

Die Klasse Article sieht so aus:


Java:
package model;

import java.beans.PropertyChangeSupport;

import javax.persistence.Column;
import javax.persistence.Entity;

@SuppressWarnings("serial")
@Entity
public class Article extends BaseEntity {

	

	public Article() {
		
	}

	// Die eindeutige Artikelnummer des Artikels (String, weil manche Systeme
	// auch Buchstaben in Artikelnummern haben)
	@Column(nullable = false, unique = true)
	private String number;

	// Die Bezeichnung des Artikels
	@Column(nullable = false)
	private String name;

	// Der Preis des Artikels (optional), sofern eine Bewertung vorgenommen
	// werden soll
	private float price;

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		String old = this.name;
		this.name = name;
		PropertyChangeSupport propertyChangeSupport;
		propertyChangeSupport = new PropertyChangeSupport(this);
		propertyChangeSupport.firePropertyChange("name", old, name);
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		// this.price = price;
		float old = this.price;
		PropertyChangeSupport propertyChangeSupport;
		propertyChangeSupport = new PropertyChangeSupport(this);
		propertyChangeSupport.firePropertyChange("price", old, price);
	}
}

[XML]<?xml version="1.0" encoding="UTF-8" ?>
<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_1_0.xsd"
version="1.0">

<!-- JPA test "unit" -->
<persistence-unit name="adp" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>model.Article</class>
<class>model.ModelProvider</class>
<class>toolgui.ArticleEditor</class>
<properties>
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/prog" />
<property name="hibernate.connection.username" value="postgres" />
<property name="hibernate.connection.password" value="database" />
<property name="hibernate.connection.pool_size" value="5" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>

</persistence>[/XML]

Was tun?
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben