Exécution de Procédures Stockées sous Oracle depuis Java
Bonjour à tous,
J'essaye actuellement d'exécuter des procédures ou des functions stockées sous oracle depuis un programme Java en utilisant les annotations liées à Oracle.
Voici mon fichier de persistance:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
<?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="mnf-pu" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- Configuring JDBC properties -->
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@strldevebdb:1529/DSEB01" />
<property name="javax.persistence.jdbc.user" value="STREAMLINE_HRMATEP" />
<property name="javax.persistence.jdbc.password" value="lkmds984!" />
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
<!-- Hibernate properties -->
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.synonyms" value="true"/>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.shutdown" value="true" />
</properties>
</persistence-unit>
</persistence> |
Voici l'entity:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
package com.memorynotfound.hibernate;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.eclipse.persistence.annotations.Struct;
import org.eclipse.persistence.platform.database.oracle.annotations.NamedPLSQLStoredFunctionQuery;
import org.eclipse.persistence.platform.database.oracle.annotations.PLSQLParameter;
import org.eclipse.persistence.platform.database.oracle.annotations.PLSQLRecord;
@NamedPLSQLStoredFunctionQuery(
name = "getCopyOfBook",
functionName = "MYPACKAGE.GET_BOOK",
returnParameter = @PLSQLParameter(
name="RESULT", databaseType="MYPACKAGE.BOOK_REC"))
@Embeddable
@Struct(
name = "BOOK_TYPE",
fields={"ID", "TITLE"})
@PLSQLRecord(
name = "MYPACKAGE.BOOK_REC",
compatibleType = "BOOK_TYPE",
javaType = CopyOfBook.class,
fields = {
@PLSQLParameter(
name="ID",
databaseType="NUMERIC_TYPE"),
@PLSQLParameter(
name="TITLE")
}
)
public class CopyOfBook {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ID")
private Integer id;
@Column(name="TITLE")
private String title;
public CopyOfBook() {
}
public CopyOfBook(String title) {
this.title = title;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", title='" + title + '\'' +
'}';
}
} |
Voici le fichier de test CopyOfApp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
package com.memorynotfound.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
public class CopyOfApp {
public static void main (String...args) throws InterruptedException {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("mnf-pu");
EntityManager em = emf.createEntityManager();
Query query = em.createNamedQuery("getCopyOfBook");
CopyOfBook result = (CopyOfBook)query.getSingleResult();
System.out.println(result.getTitle());
em.close();
emf.close();
}
} |
Et éventuellement le pom
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
<?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>com.memorynotfound.db.hibernate</groupId>
<artifactId>named-stored-procedure</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>HIBERNATE - ${project.artifactId}</name>
<url>http://memorynotfound.com</url>
<properties>
<mysql.driver.version>5.1.9</mysql.driver.version>
<hibernate.version>4.3.1.Final</hibernate.version>
</properties>
<dependencies>
<!-- dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.driver.version}</version>
</dependency-->
<dependency>
<groupId>oracle.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-web</artifactId>
<version>3.1.1-b11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project> |
Lors de l'exécution de CopyOfApp j'obtiens l'erreur suivante:
Code:
1 2 3 4 5 6 7
|
Feb 27, 2017 2:57:48 PM org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
Exception in thread "main" java.lang.IllegalArgumentException: No query defined for that name [getCopyOfBook]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.buildQueryFromName(AbstractEntityManagerImpl.java:788)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:767)
at com.memorynotfound.hibernate.CopyOfApp.main(CopyOfApp.java:15) |
Merci d'avance pour votre aide.