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.