JPA JBoss 7 und JPA/Hibernet mit MySQL

vladimir

Aktives Mitglied
Hallo liebe Forummitglieder, folgendes Problem! In JBoss7 möchte ich mittels JPA auf eine MySQL Datenbank über Hibernate gehen.

Zuerst habe ich die Datasource mit der Datenbank in JBoss eingerichtet.
Danach die META-INF/persistence.xml angelegt
[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_2_0.xsd"
version="2.0">
<persistence-unit name="amDatabase">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/amdbSQLDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.show_sql" value="true"/>
<!--
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
-->
</properties>
</persistence-unit>
</persistence>
[/XML]

Der JBoss Server erkennt die persistence.xml und baut schön die Verbindung auf. Meldet das alles in Ordnung ist.
Leider kann ich nicht in die Datenbank schreiben!

Als ManagedBean:
Java:
@Entity
//@SequenceGenerator(name="user_id", initialValue=1, allocationSize=1)
@Table(name="users")
@ManagedBean(name="user")
public class User implements Serializable{

	private static final long serialVersionUID = -8606951161159481192L;
	
	// User data
	private Integer userID;
	private String lastName;
	private String firstName;
		
	// *** USER ID ***
	/**
	 * @return the intUserID
	 */
	@Id
//    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="user_id", nullable=false)
	public Integer getUserID() {
		return userID;
	}

	public void setUserID(Integer userID) {
		this.userID = userID;
	}
	
	// *** LAST NAME ***
	/**
	 * @return the lastName
	 */
	@Column(name="lastname", nullable=false)
	public String getLastName() {
		return lastName;
	}
	/**
	 * @param lastName the lastName to set
	 */
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	
	// *** FIRST NAME ***
	/**
	 * @return the firstName
	 */
	@Column(name="firstname", nullable=false)
	public String getFirstName() {
		return firstName;
	}
	/**
	 * @param firstName the firstName to set
	 */
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
}

Ein anderes MenagedBean versucht, ein User abzuspeichern.
Java:
@ManagedBean(name="userHandler")
public class UserHandler {

	public UserHandler() {
		// TODO Auto-generated constructor stub
	}	

	public void saveMe(){
		//Erzeugen einer EntityManagerFactory mit Hilfe des symbolischen
		//Namens aus dem Persistenz Descriptor (persistence.xml)
		EntityManagerFactory emf =
				Persistence.createEntityManagerFactory("amDatabase");

		//Erzeugen eines EntityManagers für den Zugriff auf
		//die Datenbank
		EntityManager manager = manager = emf.createEntityManager();

		//Beginn einer neuen Transanktion
		EntityTransaction tx = manager.getTransaction();

		tx.begin();    

		//Erzeugen eines neuen JavaObjektes
		User usr1 = new User();
		usr1.setUserID(1);
		usr1.setFirstName("Usr");
		usr1.setLastName("Mustermann");

		//Speichern des JavaObjektes mit Hilfe des EntityManagers
		manager.persist(usr1); 

		//Abschluss der Transaktion mit einem Commit
		tx.commit();

		//Freigabe der Ressourcen des EntityManagers
		manager.close();

		//Schließen der EntityManagerFactory und Freigeben der
		//belegten Ressourcen
		emf.close();
	}
}

Die action wird auf ein PrimeFaces Button gebunden:
[XML]
<p:commandButton id="bt" action="#{userHandler.saveMe}" value="Save Me"/>
[/XML]

Sobald die Aktion ausgeführt wird, bekomme ich folgende Exception:
Java:
17:39:26,228 WARNUNG [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http-localhost-127.0.0.1-8080-1) #{userHandler.saveMe}: java.lang.NullPointerException: javax.faces.FacesException: #{userHandler.saveMe}: java.lang.NullPointerException
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
	at javax.faces.component.UICommand.broadcast(UICommand.java:315) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.7-jbossorg-2.jar:]
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
	at java.lang.Thread.run(Thread.java:679) [rt.jar:1.6.0_22]
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [jsf-impl-2.1.7-jbossorg-2.jar:]
	... 21 more
Caused by: java.lang.NullPointerException
	at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:73) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:115) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1207) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:176) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:89) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:125) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:120) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	at dev.in.time.usr.UserHandler.saveMe(UserHandler.java:24) [classes:]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_22]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.6.0_22]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.6.0_22]
	at java.lang.reflect.Method.invoke(Method.java:616) [rt.jar:1.6.0_22]
	at org.apache.el.parser.AstValue.invoke(AstValue.java:262) [jbossweb-7.0.13.Final.jar:]
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.7-jbossorg-2.jar:]
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]

Das aller tollste dabei und interessanteste, wenn ich in die Datenbank gehe, legt er mir eine Tabelle an und fügt ein Datensatz ein:
Java:
user_id = null | firstname = null; lastname = null

Was mache ich falsch (bin ein Anfänger!)?
 
J

JohannisderKaeufer

Gast
Kannst du mal schauen ob im UserHandler die Methode saveMe überhaupt aufgerufen wird. Also dort am Anfang ein Logeintrag oder ein System.out.println("UserHandler.saveMe")

Die Fehlermeldung besagt eher, daß die Methode (saveMe) nicht gefunden wird.
 

vladimir

Aktives Mitglied
Wenn ich den Rest auskommentiere, dann ist alles in Ordnung;
Java:
	public void saveMe(){
		System.err.println("UserHandler.saveMe");
		
//		//Erzeugen einer EntityManagerFactory mit Hilfe des symbolischen
//		//Namens aus dem Persistenz Descriptor (persistence.xml)
//		EntityManagerFactory emf =
//				Persistence.createEntityManagerFactory("amDatabase");
//
//		//Erzeugen eines EntityManagers für den Zugriff auf
//		//die Datenbank
//		EntityManager manager = manager = emf.createEntityManager();
//
////		//Beginn einer neuen Transanktion
////		EntityTransaction tx = manager.getTransaction();
////		tx.begin();    
////
//		//Erzeugen eines neuen JavaObjektes
//		User usr1 = new User();
//		usr1.setUserID(1);
//		usr1.setFirstName("Vasilin");
//		usr1.setLastName("Petrenkov");
//
//		//Speichern des JavaObjektes mit Hilfe des EntityManagers
//		manager.persist(usr1); 
////
////		//Abschluss der Transaktion mit einem Commit
////		tx.commit();
//
//		//Freigabe der Ressourcen des EntityManagers
//		manager.close();
//
//		//Schließen der EntityManagerFactory und Freigeben der
//		//belegten Ressourcen
//		emf.close();
	}

Ausgabe:
Java:
19:01:21,904 ERROR [stderr] (http-localhost-127.0.0.1-8080-1) UserHandler.saveMe

Wenn ich alles drin lasse, kommt die Exception und erfolgt auch keine Ausgabe!
 

Ähnliche Java Themen


Oben