Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

tomcat spring i jpa

12 views
Skip to first unread message

kamiseq

unread,
Dec 12, 2007, 3:50:58 PM12/12/07
to
niedawno udalo mi sie ustawic dostep do EntityManagera dla
wolnostojacej aplikacji wykorzystujacej hibernejta do dostepu do
dancyh. teraz chcialem wstrzyknac sobie EMFactory wykorzystujac
springa :( niestety krew mnie zalewa a serwer wciaz zwraca mi bledy:

bledy w logu
SEVERE: Exception sending context initialized event to listener
instance of class
org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'hibernateEntityManagerFactory' defined in
ServletContext resource [/WEB-INF/classes/springConfig.xml]:
Invocation of init method failed; nested exception is
java.lang.NoSuchMethodError:
org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/
String;[Ljava/lang/String;Ljava/lang/String;)V
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:
1362)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:
540)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
$1.run(AbstractAutowireCapableBeanFactory.java:485)
...
..
konfiguracja persistance.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="hibernatePersistanceUnit" transaction-
type="RESOURCE_LOCAL">
<class>pl.db.Zasob</class>
</persistence-unit>
</persistence>

konfiguracja springa context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource"
class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/
>
<property name="url" value="jdbc:postgresql://localhost:5432/
base"/>
<property name="password" value=""/>
<property name="username" value=""/>
<property name="poolPreparedStatements"><value>true</value></
property>
<property name="maxActive"><value>10</value></property>
<property name="maxIdle"><value>10</value></property>
</bean>
<bean id="hibernateEntityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName"
value="hibernatePersistanceUnit"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaDialect">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform"
value="org.hibernate.dialect.PostgreSQLDialect" />
</bean>
</property>
<property name="persistenceXmlLocation"
value="classpath:persistence.xml" />
</bean>
<!--bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="hibernateEntityManagerFactory"
ref="hibernateEntityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean-->
<!-- adnotation processors -->
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /
>
<!--tx:annotation-driven /-->
</beans>

nie wiem co tutaj moge jeszcze poprawic....
moze def. klasy entity bedzie pomocna - chociaz jest to kod
wygenerowany przez netbeansa na podstawie definicji na bazie danych.

package pl.db;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
*
* @author pk
*/
@Entity
@Table(name = "zasoby")
@NamedQueries({@NamedQuery(name = "Zasoby.findByIdZasobu", query =
"SELECT z FROM Zasoby z WHERE z.idZasobu = :idZasobu"),
@NamedQuery(name = "Zasoby.findByIdUzytkownika", query = "SELECT z
FROM Zasoby z WHERE z.idUzytkownika = :idUzytkownika"),
@NamedQuery(name = "Zasoby.findByIdMiejsca", query = "SELECT z FROM
Zasoby z WHERE z.idMiejsca = :idMiejsca"), @NamedQuery(name =
"Zasoby.findByNazwa", query = "SELECT z FROM Zasoby z WHERE z.nazwa
= :nazwa"), @NamedQuery(name = "Zasoby.findByOpis", query = "SELECT z
FROM Zasoby z WHERE z.opis = :opis"), @NamedQuery(name =
"Zasoby.findByNumerSeryjny", query = "SELECT z FROM Zasoby z WHERE
z.numerSeryjny = :numerSeryjny")})
public class Zasob implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id_zasobu", nullable = false)
@GeneratedValue
private Integer idZasobu;
@Column(name = "id_uzytkownika")
private Integer idUzytkownika;
@Column(name = "id_miejsca", nullable = false)
private int idMiejsca;
@Column(name = "nazwa")
private String nazwa;
@Column(name = "opis")
private String opis;
@Column(name = "numer_seryjny")
private String numerSeryjny;

public Zasob() {
}

public Zasob(Integer idZasobu) {
this.idZasobu = idZasobu;
}

public Zasob(Integer idZasobu, int idMiejsca) {
this.idZasobu = idZasobu;
this.idMiejsca = idMiejsca;
}
public Integer getIdZasobu() {
return idZasobu;
}

public void setIdZasobu(Integer idZasobu) {
this.idZasobu = idZasobu;
}

public Integer getIdUzytkownika() {
return idUzytkownika;
}

public void setIdUzytkownika(Integer idUzytkownika) {
this.idUzytkownika = idUzytkownika;
}

public int getIdMiejsca() {
return idMiejsca;
}

public void setIdMiejsca(int idMiejsca) {
this.idMiejsca = idMiejsca;
}

public String getNazwa() {
return nazwa;
}

public void setNazwa(String nazwa) {
this.nazwa = nazwa;
}

public String getOpis() {
return opis;
}

public void setOpis(String opis) {
this.opis = opis;
}

public String getNumerSeryjny() {
return numerSeryjny;
}

public void setNumerSeryjny(String numerSeryjny) {
this.numerSeryjny = numerSeryjny;
}

@Override
public int hashCode() {
int hash = 0;
hash += (idZasobu != null ? idZasobu.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id
fields are not set
if (!(object instanceof Zasob)) {
return false;
}
Zasob other = (Zasob) object;
if ((this.idZasobu == null && other.idZasobu != null) ||
(this.idZasobu != null && !this.idZasobu.equals(other.idZasobu))) {
return false;
}
return true;
}

@Override
public String toString() {
return "pl.mccomp.db.Zasoby[idZasobu=" + idZasobu + "]";
}

}

Jacek Wojciechowski

unread,
Dec 12, 2007, 8:35:29 PM12/12/07
to
kamiseq wrote:

> bledy w logu
> SEVERE: Exception sending context initialized event to listener
> instance of class
> org.springframework.web.context.ContextLoaderListener
> org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'hibernateEntityManagerFactory' defined in
> ServletContext resource [/WEB-INF/classes/springConfig.xml]:
> Invocation of init method failed; nested exception is
> java.lang.NoSuchMethodError:
> org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/
> String;[Ljava/lang/String;Ljava/lang/String;)V

Wygląda to tak, jakbyś używał złej wersji ASMa.

Ja używam asm-1.5.3.jar z hibernate-3.2.4.sp1.jar,
hibernate-annotations-3.2.1.ga.jar i hibernate-entitymanager-3.2.1.ga.jar
oraz spring-2.0.6.jar... i działa.

Oczywiście Hibernate ma jeszcze parę innych kluczowych zależności.


--
Pozdrawiam,
J.W.

kamiseq

unread,
Dec 13, 2007, 4:28:50 AM12/13/07
to

hibernata sciagnolem najnowszego, gdzie mialbym szukac odpowiedz czy
moj hibernate jest zgodny?
a co z xml czy konfiguracja jest ok?

Jacek Wojciechowski

unread,
Dec 13, 2007, 5:49:03 PM12/13/07
to
kamiseq wrote:

> hibernata sciagnolem najnowszego, gdzie mialbym szukac odpowiedz czy
> moj hibernate jest zgodny?

No ja tu czegoś nie rozumiem. Czym to kompilujesz i deploy'ujesz?? Maven,
Ant, Eclipse, IDEA, czy jeszcze jakoś inaczej?? Tu masz zależności wersji
Hibernate o której pisałem:
http://repo1.maven.org/maven2/org/hibernate/hibernate/3.2.4.ga/hibernate-3.2.4.ga.pom

Nie wszystkie są obowiązkowe - można się obyć bez paru.

Może powiem tak: żeby hibernate-*.jar zadziałał, to muszą być w tym samym
katalogu inne *.jar'y, które Hibernate wykorzystuje. A u Ciebie się
znajduje niewłaściwy asm-*.jar (albo jakieś narzędzie w którym kompilujesz
niewłaściwy podrzuca).

Żeby jeszcze była jasność: te *.jar'y nie są potrzebne na etapie kompilacji,
tylko już po deploy'u. Może zły *.jar

A.. pewnie na Tomcat jest niewłaściwa wersja asm i wystarczy ją zmienić.

> a co z xml czy konfiguracja jest ok?

To nie jest problem z konfiguracją. Na pewno.

--
Pozdrawiam,
Jacek Wojciechowski

kamiseq

unread,
Dec 14, 2007, 3:38:13 AM12/14/07
to
On Dec 13, 11:49 pm, Jacek Wojciechowski

<jacekwojciechowski1WYTNI...@gmail.com> wrote:
> kamiseq wrote:
> > hibernata sciagnolem najnowszego, gdzie mialbym szukac odpowiedz czy
> > moj hibernate jest zgodny?
>
> No ja tu czegoś nie rozumiem. Czym to kompilujesz i deploy'ujesz?? Maven,
> Ant, Eclipse, IDEA, czy jeszcze jakoś inaczej?? Tu masz zależności wersji
> Hibernate o której pisałem:http://repo1.maven.org/maven2/org/hibernate/hibernate/3.2.4.ga/hibern...

>
> Nie wszystkie są obowiązkowe - można się obyć bez paru.
>
> Może powiem tak: żeby hibernate-*.jar zadziałał, to muszą być w tym samym
> katalogu inne *.jar'y, które Hibernate wykorzystuje. A u Ciebie się
> znajduje niewłaściwy asm-*.jar (albo jakieś narzędzie w którym kompilujesz
> niewłaściwy podrzuca).
>
> Żeby jeszcze była jasność: te *.jar'y nie są potrzebne na etapie kompilacji,
> tylko już po deploy'u. Może zły *.jar
>
> A.. pewnie na Tomcat jest niewłaściwa wersja asm i wystarczy ją zmienić.
>
> > a co z xml czy konfiguracja jest ok?
>
> To nie jest problem z konfiguracją. Na pewno.
>
> --
> Pozdrawiam,
> Jacek Wojciechowski

uzywam netbeansa, netbeans dorzucil mi biblioteki springa 2.5 i tam
byl asm wyrzucilem wszystkie asmy springowe i przeszlo. teraz rzuca
sie ze moje namedQuery w klasach Entity (wygenerowane przez netbeansa
na podstawie bazy danych) powoduja bledy......... wiec zabawa:-)
zastanawaiem sie czy jest to zwiazane z definicja klasy Entity ktora
miala pola powiazane z innymi tabelami. postaram sie to wszystko
uproscic na poczatek

rozumiem ze przy tworzeniu entity managera sprawdzane sa wszystkie
zaleznosci miedzy klasami entity?

Jacek Wojciechowski

unread,
Dec 14, 2007, 1:52:15 PM12/14/07
to
kamiseq wrote:

> teraz rzuca
> sie ze moje namedQuery w klasach Entity (wygenerowane przez netbeansa
> na podstawie bazy danych) powoduja bledy......... wiec zabawa:-)

To są zapytania EJB-QL. Pewnie wystarczy poprawić identyfikator Zasoby
(nazwa tabeli) na Zasob (nazwa klasy), ewentulanie nazwy kolumn trzeba
zmienić na nazwy właściwości.



> rozumiem ze przy tworzeniu entity managera sprawdzane sa wszystkie
> zaleznosci miedzy klasami entity?

Tak.

--
Pozdrawiam,
J.W.

kamiseq

unread,
Dec 14, 2007, 6:15:00 PM12/14/07
to

> To są zapytania EJB-QL. Pewnie wystarczy poprawić identyfikator Zasoby
> (nazwa tabeli) na Zasob (nazwa klasy), ewentulanie nazwy kolumn trzeba
> zmienić na nazwy właściwości.

tak, tworzac klase odwolywal sie poprzez pola do nieistniejacych
tabel. ok wszystko fajnie

jak moge cie jeszcze pomeczyc.moglbys mi mniej wiecej wyjasnic jak
teraz spring laduje entitymanagera?

1)ustawiam sobie beana id=hibernateEntityManagerFactory i opisuje go
tak jak wyzej podalem(w poprzednich mailach)
2)skoro bean zostal utworzony podczas startu contextu to powinno byc
juz ok,
3)tworze klase TestLogic

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import pl.mccomp.db.Tabela;

/**
*
* @author pk
*/

public class TestLogic {
protected EntityManager em;
public TestLogic(){

}
public void save(Tabela z){
System.out.println("id = "+z.getId());
em.persist(z);
}
@PersistenceContext
public void setHibernateEntityManager(EntityManager em){
this.em = em;
}
}
i z tego co wyszukalem na googlach to adnotacja powinna zalatwic
reszte. niestety dostaje
Servlet.service() for servlet DbConnectorServlet threw exception
java.lang.NullPointerException at
pl.mccomp.logic.TestLogic.save(TestLogic.java:24)

stwierdzilem ze w takim razie moze mu brakuje bena tej klasy
<bean id="testInjection" class="pl.mccomp.logic.TestLogic">


<property name="hibernateEntityManagerFactory"
ref="hibernateEntityManagerFactory" />

</bean>
i zmieniam w definicji klasy
@PersistenceContext
public void setHibernateEntityManagerFactory(EntityManagerFactory
emf){
this.em = emf.createEntityManager();
}
w logu wywalilo bledem ze
Initialization of bean failed; nested exception is
java.lang.IllegalStateException: Specified resource type
[javax.persistence.EntityManager] is not assignable to method
parameter type [interface javax.persistence.EntityManagerFactory]

no to sobie mysle ze w jakis magiczny sposob wstrzykuje mi juz gotowe
EM. jednak nie

potem stwierdzilem ze adnotacja @PersistenceContext cos tu psuje i
wymazalem adnotacje i wrocilem do wstrzykniecia EMF poprzez beana tak
jak przy drugim podejsciu. jednak nie, w logu pojawia sie

Servlet.service() for servlet DbConnectorServlet threw exception
java.lang.NullPointerException at
pl.mccomp.logic.TestLogic.save(TestLogic.java:24)

troche juz nie wiem co tu moge jeszcze wymyslic zwlaszcza, ze google
nie zwraca jakis sensownych odpowiedzi:(
moze gdzies robie jeszcze jakis blad

troche mnie dziwi ze przy wstrzykiwaniu obiektu poprzez
setHibernateEMF zwraca null (przypadek bez adnotacji). powinnien
potraktowac wtedy ta klase jak kazda inna, czy moze to swiadczyc o tym
ze sa jeszcze jakies bledy przy towrzeniu mojego bean hibernateEMF??

dzieki za zainteresowanie

Jacek Wojciechowski

unread,
Dec 14, 2007, 9:04:51 PM12/14/07
to
kamiseq wrote:

> @PersistenceContext

Tak w ogóle to polecam SpringFramework Reference - tam jest wszystko
świetnie opisane.

Dodaj sobie coś takiego do konfiguracji kontekstu:
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

To powinno sprawić, żeby pod @PersistenceContext wstrzykiwał Ci
EntityManagera.

U mnie reszta wygląda mniej wiecej tak:

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"/>

<tx:annotation-driven/>

<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">

<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="simpleDAO"
class="pl.edu.pw.elka.jwojcie1.demia.core.dao.archetype.SimpleDAOImpl"
</bean>


--
Pozdrawiam,
J.W.

kamiseq

unread,
Dec 15, 2007, 5:34:05 AM12/15/07
to
no i dokladnie tak mam to poustawianehttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<bean id="dataSource"
class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/
>
<property name="url" value="jdbc:postgresql://localhost:5432/
mccomp"/>
<property name="password" value="pass"/>
<property name="username" value="user"/>

<property name="poolPreparedStatements"><value>true</value></
property>
<property name="maxActive"><value>10</value></property>
<property name="maxIdle"><value>10</value></property>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName"
value="hibernatePersistanceUnit"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaDialect">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform"
value="org.hibernate.dialect.PostgreSQLDialect" />
</bean>
</property>
<property name="persistenceXmlLocation"
value="classpath:persistence.xml" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory"/>
</bean>
<!-- adnotation processors -->
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /
>
<tx:annotation-driven />

<bean id="testInjection" class="pl.mccomp.logic.TestLogic">
</bean>
</beans>

i wywala mi blad nullpointera przy probie uzycia em

Jacek Wojciechowski

unread,
Dec 15, 2007, 9:15:50 AM12/15/07
to
A czy metoda wywołująca Twoja metodę TestLogic.save jest oznaczona jako
@Transactional? Patrz temat "deklaratywne zarządzanie transakcjami w
Springu".

--
Pozdrawiam,
J.W.

kamiseq

unread,
Dec 15, 2007, 9:49:26 AM12/15/07
to
On Dec 15, 3:15 pm, Jacek Wojciechowski

nie nie jest, wyszedlem z zalozenia ze transakcja jest czyms
dodatkowym i chcialem sie kupic na samym entityM.
sprawdze, dzieki

kamiseq

unread,
Dec 16, 2007, 5:48:10 AM12/16/07
to
dobra dzieki wielkie, dziala, przoczylem jeden szczegol. grunt ze
dziala.

pozdrawiam

0 new messages