Hibernate mit JPA, JTA und Glassfish-Anwendungs-Server scheint nicht zu Begehen
Ich bin neu zu überwintern und ich möchte es, um die Datenbank-Verbindung vom application server über JNDI.
Das Merkwürdige ist, dass es schafft meine Tabellen in der Datenbank, aber es nicht speichern der Entität. Es scheint, dass es nicht zu Begehen.
Hat jemand ähnliches erlebt Probleme mit Ruhezustand?
Dies ist eine kleine test-servlet:
public class WriteTest extends HttpServlet
{
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
/*try
{
User user = new User("Hans", "Maulwurf", "[email protected]");
InitialContext ctx = new InitialContext();
UserFacadeBean bean = (UserFacadeBean) ctx.lookup("ejb/UserFacadeBeanService");
bean.persist(user);
}
catch (NamingException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}*/
EntityManager em = JpaUtil.getEntityManagerFactory().createEntityManager();
//em.getTransaction().begin();
System.out.println("Begin transfer");
User user = new User("Hans", "Maulwurf", "[email protected]");
Adress adress = new Adress("Deppenstraße 3","Deppingen");
//user.setAddress(adress);
System.out.println("Save User 'Hans Maulwurf'");
em.persist(user);
//em.persist(adress);
//em.getTransaction().commit();
em.close();
System.out.println("Everything went better than expected!");
}
}
Dies ist der kleine Helfer-Klasse:
public class JpaUtil
{
private static final EntityManagerFactory emf;
static
{
try
{
System.out.println("Initialize EntityManagerFactory...");
emf = Persistence.createEntityManagerFactory("testPU");
}
catch (Throwable ex)
{
System.err.println("Initial EntityManagerFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static EntityManagerFactory getEntityManagerFactory()
{
return emf;
}
}
Mein user-Objekt:
@Entity
@Table(name = "T_UserJpa")
public class User implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Embedded
@AttributeOverrides(
{
@AttributeOverride(name = "street", column =
@Column(name = "user_street")),
@AttributeOverride(name = "city", column =
@Column(name = "user_city", length = 50))
})
private Adress adress;
private String firstname;
private String lastname;
private String email;
public User()
{
}
public User(String firstname, String lastname, String email)
{
this.firstname = firstname;
this.lastname = lastname;
this.email = email;
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public Adress getAddress()
{
return adress;
}
public void setAddress(Adress adress)
{
this.adress = adress;
}
public String getFirstname()
{
return firstname;
}
public void setFirstname(String firstname)
{
this.firstname = firstname;
}
public String getLastname()
{
return lastname;
}
public void setLastname(String lastname)
{
this.lastname = lastname;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (!(obj instanceof User))
{
return false;
}
final User user = (User) obj;
return !(email != null ? !email.equals(user.email) : user.email != null);
}
@Override
public int hashCode()
{
return 29 * (email != null ? email.hashCode() : 0);
}
}
Meine persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="testPU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/testdb</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.connection.autocommit" value="true"/>
</properties>
</persistence-unit>
</persistence>
Edit: ich vergaß zu erwähnen, dass ich bereits verwendet, die Informationen in diesem thread: Lern-Ressource für die Konfiguration von Hibernate JPA 2.0 auf Glassfish server
InformationsquelleAutor mw88 | 2011-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
In einem application server können Sie entweder einen container managed
EntityManager
(aka, eine Persistenz-Kontext) oder eine von der Anwendung verwalteteEntityManager
. In beiden Fällen würde die Zuordnung der Persistenz-Kontext mit einer Transaktion, die entweder eine JTA-Transaktion, oder plain JDBC Transaktion.Bezug auf Ihr problem an hand der folgenden Punkte sollten berücksichtigt werden:
persistence.xml
Datei gibt an, dass Sie beabsichtigen, die Verwendung einer JTA-datasource und damit, JTA-Transaktionen durchführen von Transaktions-Arbeit.JpaUtil
Klasse ist verantwortlich für die Erstellung von application-managedEntityManager
Instanzen.In Anbetracht der beiden oben genannten Aussagen und dem Verhalten aufgezeigt, indem Ihre Anwendung, es scheint, dass Ihre
EntityManager
Instanz ist, die nicht im Zusammenhang mit einer JTA-Transaktion. Daher werden alle änderungen in den Persistenz-Kontext, wird einfach nicht in die Datenbank übertragen. Dies ist einfach aufgrund der Tatsache, dass der JPA-provider setzen auf die JTA-Transaktion und eingetragen Ressourcen zur Durchführung von Transaktionen arbeiten; wenn keine gefunden werden, wird keine Arbeit getan werden (anders als bei Ressource-Lokalen Transaktionen, bei denen die Verbindung pool und Ressource-Eintragung erfolgt durch den JPA-provider selbst).Den Punkt daher, dass die
EntityManager
oder die Persistenz Kontext zugeordnet sein muss, eine aktive Transaktion, bevor Sie änderungen an Entitäten, so dass alle änderungen an den Entitäten in den Persistenz-Kontext werden die in die Datenbank übertragen. Das problem zu beheben, müssen Sie:starten Sie eine neue JTA-Transaktion. Sie konnten entscheiden, entweder für container-verwaltete Transaktionen oder von der Anwendung verwaltete Transaktionen.
Anwendung oder Bean-verwaltete Transaktionen werden von der Anwendung verwaltet sich selbst und
nicht durch den container. Während dies vielleicht geeignet erscheinen, in Ihrem Fall, tun, beachten Sie, dass Sie sind jetzt verantwortlich für das transaction management; oft wird diese Strategie führt zu Fehlern, und oft, es ist nicht gut verstanden, durch die Entwickler mit dem Ergebnis, dass es wird oft als eine schlechte Praxis in den meisten Projekten. Wenn Sie möchten, verwenden Sie Bean-verwaltete Transaktionen, dann werden Sie brauchen, um eine Transaktion zu starten mit dem
UserTransaction
API-Klasse, wie unten gezeigt:Der obige code ist nicht ganz serienreif ist. Zum Beispiel, es führt keine exception handling, und auch nicht explizit rollback der änderungen, die im Falle eines anwendungsfehlers.
join the
EntityManager
Instanz mit der JTA-Transaktion, wenn dieEntityManager
ist nicht bereits im Zusammenhang mit der JTA-Transaktion. Dies ist nicht erforderlich, wenn Sie starten Sie den JTA-Transaktion erste (das in dem obigen Beispiel mit Bean-Verwalteten Transaktionen), aber wenn Sie dieEntityManager
zuerst mit IhrerJpaUtil
Klasse, und dann starten Sie die Transaktion später, dann müssen Sie dieEntityManager.joinTransaction()
Methode, um die join-Persistenz Kontext mit der JTA-Transaktion. Ganz offenbar, änderungen gespült aus dem Persistenz-Kontext nicht im Zusammenhang mit einer Transaktion, werden ignoriert.InformationsquelleAutor Vineet Reynolds
Sollten Sie die Transaktionsunterstützung durch die container. Dies ist eine Beispiele aus dem Buch Pro JPA 2-Mastering the Java Persistence API. Ich hoffe, das hilft:
InformationsquelleAutor Edwin Dalorzo
Diese Anleitung ist für die Integration von hibernate.4.3.5 und EJB-und JTA und GlassFish.4.0 in NetBeans.8.0 IDE. Erstellen Sie ein web-Projekt in der net-beans (Achtung: nicht machen ein web-Projekt mit maven, weil es gibt einen bug in Netbeans.8.0 IDE ) und add hibernate-jar-Dateien zu dem Projekt, andere Einstellung, die im Zusammenhang mit der Konfiguration von MySql und glassfish ist sehr einfach(Nur Verbindung definieren Pool-und JDBC-Ressourcen - >JDBC:JDBC-Connection-Pools & JDBC-Ressourcen, Führung, denn das ist im web, wenn Sie Suche nach es)(Achtung: für die Definition der richtigen JNDI, erstellen Sie zuerst eine temporäre Projekt-das hängt davon ab, JNDI, wie JPA-Projekt in glassfish, kopieren Sie dann die Einstellungen, die erstellt wird, in der Glassfish für dieses Projekt, weil es einen bug im glassfish, wenn Sie gehen, um einen ping zu MySQl bei der Erstellung Ihrer ersten Verbindungs-Pool wenn Sie es schaffen, durch die Sie sich innerhalb der glassfish), so dass ich nicht in diesem Artikel beschreiben Sie dann erstellen persistence.xml Datei wie folgt :
In Ihrer EJB-Klasse (Klasse, annotiert mit @Stateless) für das erstellen EntityManager verwenden Sie folgende syntax :
Wie Sie Wissen, wenn Sie “transaction-type="JTA", die Verwaltung der Transaktion ist nicht mit Ihnen, das bedeutet, dass die Verwaltung das öffnen und schließen der Transaktion ist ein Anwendungs-server (Hier GlassFish) Verantwortung. In der Tat, wenn Sie überprüfen Sie Ihre persistence.xml im design-Modus, vor der Persistenz-provider, drop-down-box können Sie sehen, hibernate ist nun Hinzugefügt.
InformationsquelleAutor user2875754
Tut es Begehen, wenn Sie maunally commit Ihre veränderten ie, wenn Sie die Auskommentierung der commit-Linie?
Versuchen Sie auch überprüfen Sie die Konfiguration wird durch
toggleAutoCommit = Sitzung.Verbindung().getAutoCommit();
ich glaube, was u tun müssen, ist em.getsession und überprüfen Sie, dass Sie nicht verwenden können, die getTransaction wie Sie arent, die diese api nutzen
Der EntityManager hat keine solche Methode, weil es scheint, zu behandeln, die session-und Transaktions-und mir nicht erlaubt, ihn zu erreichen. Ich spielte ein bisschen mit erröten, aber es ist bereits die Automatik gewählt.
Ich würde davon absehen auto-commit in der configuaration, wie es ist sehr gefährlich und kann führen zu Defekten Einheiten und hat Probleme mit bestimmten db-Treiber aus Erfahrung, wenn Sie Ihre servket zu verpflichten, für Sie , der übliche Weg ist, um diese Schicht als ein DAO, die diese Vorgänge für Sie
InformationsquelleAutor Chris