JSF JPA Połączenie z bazą danych

0
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

public class BookDao {

    EntityManagerFactory entityManagerFactory;
    @PersistenceContext
    private EntityManager em;

    public BookDao() {
        System.err.println("krok 1");
        entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
        System.err.println("krok 2");
        em = entityManagerFactory.createEntityManager();
        System.err.println("krok 3");
    }

    public List<Book> getAllBooks() {
//        TypedQuery<Book> q = em.createQuery("select title from Book", Book.class);
//        List<Book> resultList = q.getResultList();
//        return resultList;
        return new ArrayList<>();
    }
}

W linii Persistence.createEntityManagerFactory("myDatabase"); Dostaję błąd

java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance

Dodam że samo Dao jest injektowane wcześnie w innej warstwie w klasie z adnotacją Stateless

Do bazy danych tu wykorzystuję persistante.xml w którym mam

<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="myDatabase" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.user" value="radek" />
            <property name="javax.persistence.jdbc.password" value="password" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/biblioteka" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
        </properties>
    </persistence-unit>
</persistence>

Całość kodu jest to https://github.com/cytryna/zielonaBiblioteka

W jaki sposób mam prawidłowo skonfigurować połączenie do bazy danych ?

0

Wez tam wstaw gdzies breakpointa na kroku 1 i sprawdz czy przypadkiem em nie jest juz wstrzykniety?

0

Cześć,

napisałeś coś takiego:

"Dodam że samo Dao jest injektowane wcześnie w innej warstwie w klasie z adnotacją Stateless"

co masz na myśli mówiąc "injectowane"? Jeśli masz na myśli injectowanie bean'a to w zwłykłym Tomcacie nie ma szans tego zrobić, bo Tomcat to wyłącznie servlet container. Do injectowania potrzebny Ci jakiś application server. Myślę, ze w ogóle ten wyjątek dotyczy tego właśnie problemu.

Aaa, no i żeby móc injectować klasę, musisz ją najpierw uczynić obiektem, który w ogóle DA SIĘ injectować. Twojej klasy nie da injectować, bo nie jest to bean.

0

Już chyba ogarnąłem bałagan z ejb :)

Teraz dostaję taki błąd

Caused by: java.lang.ClassNotFoundException: Could not load requested class : com.mysql.jdbc.Driver
	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:230)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)

Trochę mnie to dziwi bo w projekcie mam zwykłą klasę main i z niej nawiązuję połączenie i pobieram dane z bazy a jak odpalam na jBosie to dostęję
Could not load requested class : com.mysql.jdbc.Driver

Mój persistance.xml

<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="myDatabase" transaction-type="RESOURCE_LOCAL">
        <!--<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>-->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.user" value="radek" />
            <property name="javax.persistence.jdbc.password" value="radek" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/biblioteka" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <!--<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />-->
            <!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
        </properties>
    </persistence-unit>
</persistence>

i maven

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>rwichrowski</groupId>
    <artifactId>zielonaBiblioteka</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.jboss.as</groupId>
            <artifactId>jboss-as-server</artifactId>
            <version>7.2.0.Final</version>
            <!--<scope>provided</scope>-->
        </dependency>

        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jandex</artifactId>
            <version>2.0.0.Final</version>
            <!--<scope>provided</scope>-->
        </dependency>

        <!--<dependency>-->
            <!--<groupId>org.jboss.spec.javax.faces</groupId>-->
            <!--<artifactId>jboss-jsf-api_2.0_spec</artifactId>-->
            <!--<version>1.0.0.Final</version>-->
            <!--&lt;!&ndash;<scope>provided</scope>&ndash;&gt;-->
        <!--</dependency>-->

        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>mojarra-jsf-impl</artifactId>
            <version>2.0.0-b04</version>
        </dependency>

        <!--<dependency>-->
            <!--<groupId>mysql</groupId>-->
            <!--<artifactId>mysql-connector-java</artifactId>-->
            <!--<version>5.1.38</version>-->
        <!--</dependency>-->

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.8.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>

        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.spec.javax.ejb</groupId>
            <artifactId>jboss-ejb-api_3.2_spec</artifactId>
            <version>1.0.0.Final</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

</project>
0

a spróbuj dodać tę linijkę:
<jta-data-source>java:jboss/datasources/jbossas7development</jta-data-source>

tutaj:

<persistence-unit name="myDatabase" transaction-type="RESOURCE_LOCAL">
        <!--<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>-->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

transaction-type zmień na "JTA".

Też się z tym bawiłem w tym tygodniu i korzystałem z tej książki:
http://www.allitebooks.com/jboss-as-7-development/

0

@stopa Niestety nie pomogło

Tak jak patrzę na ten błąd trochę z boku to jest on dosyć oczywisty, brakuje biblioteki do bazy danych.

Could not load requested class : com.mysql.jdbc.Driver

I rzeczywiście w moim WEB-INF/lib nic nie ma, ale czy powinno być jeśli buduję projekt maven -em?

Może zależności w pomie się nakładają i nadpisują ? Nie wiem.

0

No i tak, dodając jara do mySql zaczęło działać :( ale czemu ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1