Testowanie zapytań JPQL w NetBeans

Testowanie zapytań JPQL w NetBeans
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,
Prowadzę niszczącą walkę z narzędziem do testowania JPQL. Korzystam z NetBeans 7.3. Moje zapytania działają, nie mogę jednak ich przetestować.

IDE zapewnia konsole do testowania JPQL. Mogę ją uruchomić po zaznaczeniu pliku persistance.xml i wybraniu "Run JPQL Query".

Po uruchomieniu konsolki widzę mój "Persistance Unit" i mogę pisać zapytanie. Niewiele myśląc piszę proste zapytanie (zwrócenie wszystkich kategorii):
"SELECT c FROM Category c"

Mój serwer aplikacji jak i baza danych są oczywiście uruchomione. W jednej z encji mam podpiete joda-time (scope provider, wrzucone na serwer aplikacji, dziala i konwertuje joda DateTime na java.sql.Timestamp i odwrotnie).

W PeristanceUnit bez jodaTime tez nie moge wykonac zadnego zapytania. Co trzeba zrobic, aby mozna bylo wykonac zapytanie JPQL? W gre wchodzi uzycie innego narzedzia niz NetBeans.

Kopiuj
avax.persistence.PersistenceException: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Deployment of PersistenceUnit [pl.nikt_biblio-ejb_ejb_1.0-SNAPSHOTPU] failed. Close all factories for this PersistenceUnit.
Internal Exception: java.lang.NoClassDefFoundError: org/joda/time/DateTime
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createDeployFailedPersistenceException(EntityManagerSetupImpl.java:816)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:756)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:204)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:304)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
Caused by: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Deployment of PersistenceUnit [pl.nikt_biblio-ejb_ejb_1.0-SNAPSHOTPU] failed. Close all factories for this PersistenceUnit.
Internal Exception: java.lang.NoClassDefFoundError: org/joda/time/DateTime
    at org.eclipse.persistence.exceptions.EntityManagerSetupException.deployFailed(EntityManagerSetupException.java:238)
    ... 8 more
Caused by: java.lang.NoClassDefFoundError: org/joda/time/DateTime
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
    at java.lang.Class.getDeclaredMethods(Class.java:1845)
    at org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getDeclaredMethods(PrivilegedAccessHelper.java:324)
    at org.eclipse.persistence.internal.jpa.metadata.listeners.EntityListenerMetadata.getDeclaredMethods(EntityListenerMetadata.java:254)
    at org.eclipse.persistence.internal.jpa.metadata.listeners.EntityClassListenerMetadata.process(EntityClassListenerMetadata.java:89)
    at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.processListeners(EntityAccessor.java:1220)
    at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.addEntityListeners(MetadataProcessor.java:138)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:588)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: org.joda.time.DateTime
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 15 more

Moj persitance.xml:

Kopiuj
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="pl.nikt_biblio-ejb_ejb_1.0-SNAPSHOTPU" transaction-type="JTA">
    <jta-data-source>jdbc/projekt</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

Moja encja:

Kopiuj
package pl.nikt.entities;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/*
 * @author Nikt
 */
@Entity
@Table(name = "category")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Category.findAll", query = "SELECT c FROM Category c"),
    @NamedQuery(name = "Category.findByCategoryId", query = "SELECT c FROM Category c WHERE c.categoryId = :categoryId"),
    @NamedQuery(name = "Category.findByCategoryName", query = "SELECT c FROM Category c WHERE c.categoryName = :categoryName"),
    @NamedQuery(name = "Category.findByNumberOfFiles", query = "SELECT c FROM Category c WHERE c.numberOfFiles = :numberOfFiles")})
public class Category implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(generator = "category_seq", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "category_seq", sequenceName = "category_id_seq", allocationSize = 1)
    @Basic(optional = false)
    @Column(name = "category_id", unique = true)
    private Integer categoryId;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 80)
    @Column(name = "category_name", unique = true)
    private String categoryName;
    @Basic(optional = false)
    @NotNull
    @Column(name = "number_of_files")
    private int numberOfFiles;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "categoryId")
    private List<File> fileList;

    public Category() {
    }

    public Category(Integer categoryId) {
        this.categoryId = categoryId;
    }

    public Category(String categoryName) {
        this.categoryName = categoryName;
        this.numberOfFiles = 0;
    }

    public Category(Integer categoryId, String categoryName, int numberOfFiles) {
        this.categoryId = categoryId;
        this.categoryName = categoryName;
        this.numberOfFiles = numberOfFiles;
    }

    public Integer getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(Integer categoryId) {
        this.categoryId = categoryId;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public int getNumberOfFiles() {
        return numberOfFiles;
    }

    public void setNumberOfFiles(int numberOfFiles) {
        this.numberOfFiles = numberOfFiles;
    }

    @XmlTransient
    public List<File> getFileList() {
        return fileList;
    }

    public void setFileList(List<File> fileList) {
        this.fileList = fileList;
    }

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

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Category)) {
            return false;
        }
        Category other = (Category) object;
        if ((this.categoryId == null && other.categoryId != null) || (this.categoryId != null && !this.categoryId.equals(other.categoryId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "pl.nikt.entities.Category[ categoryId=" + categoryId + " ]";
    }
}

  • Rejestracja: dni
  • Ostatnio: dni
0

java.lang.NoClassDefFoundError: org/joda/time/DateTime

to ewidentnie wskazuje, że problemem jest tu brak biblioteki. Możesz albo w ustawieniach projektu zaznaczyć aby była ona dołączana do projektu, albo umieścić ją w odpowiednim miejscu na serwerze aplikacji.
Wklej błąd, który dostajesz gdy nie używasz biblioteki, albo gdy ją udostępnisz dla projektu. Wtedy zobaczymy co dalej.

  • Rejestracja: dni
  • Ostatnio: dni
0

Projekt jest mavenowy.

W pom.xml mam:

Kopiuj
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.3</version>
            <scope>provided</scope>
        </dependency>

Biblioteka jest zainstalowana w glassfish/lib. W przypadku, gdy nie mam jej na Glassfishu nie udaje sie zadeployowac modulu EJB z glassfishem (w momencie wlaczania dostawalbym blad, o ktorym wspomniales).

Dla testu zmienilem na scope compile (pozostawiajac joda-time na serwerze: bez tego nie bedzie dzialac)

Kopiuj
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.3</version>
        </dependency>

W tej chwili stacktrace prezentuje sie tak:

Kopiuj
java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Problem compiling [SELECT c FROM Category c]. 
[14, 22] The abstract schema type 'Category' is unknown.
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1585)
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Problem compiling [SELECT c FROM Category c]. 
[14, 22] The abstract schema type 'Category' is unknown.
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155)
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:347)
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278)
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1583)
    ... 2 more

Ogolnie jest tak, ze raz dziala, raz nie dziala dla tego samego zapytania. Dziwne, ale da sie pracowac.

Wniosek jest wiec nastepujacy:

  • przed wrzuceniem ostatecznej wersji warto zmienic scope na provided, ale na etapie testowania zapytan musi byc compile

Dziekuje za naprowadzenie i pozdarawiam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.