2017-04-12 6 views
0

J'ai lu certaines des réponses comme en ajoutant? Searchpath = myschema ou? CurrentSchema = myschema mais cela ne fonctionne toujours pas dans mon cas. J'utilise NetBeans et je peux exécuter des commandes à la connexion avec le schéma prévu et cela fonctionne bien mais en cours d'exécution, Glassfish se connecte uniquement au schéma public en ignorant le? CurrentSchema = myschema. Ma version est postgresql 9.6 et la version du pilote JDBC est le dernier 42.0.0Spécification d'un schéma dans pool de connexions jdbc glassfish?

Ceci est mon GlassFish-resource.xml:

<resources> 
    <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.postgresql.ds.PGSimpleDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="post-gre-sql_aegwyncreds_dbexerphi_dbaPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> 
     <property name="serverName" value="localhost"/> 
     <property name="portNumber" value="5432"/> 
     <property name="databaseName" value="mydb"/> 
     <property name="User" value="user"/> 
     <property name="Password" value="pass"/> 
     <property name="URL" value="jdbc:postgresql://localhost:5432/mydb?currentSchema=myschema"/> 
     <property name="driverClass" value="org.postgresql.Driver"/> 
    </jdbc-connection-pool> 
    <jdbc-resource enabled="true" jndi-name="java:app/myjndisource" object-type="user" pool-name="post-gre-sql_mydb_user_dbaPool"/> 
</resources> 

Ceci est mon unité de persistance:

<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="myPU" transaction-type="JTA"> 
    <jta-data-source>java:app/myjndisource</jta-data-source> 
    <class>myclass</class> 
    . . . . . . . . . . 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
    </properties> 
    </persistence-unit> 
</persistence> 
+0

Le schéma ne fait pas partie de la chaîne de connexion. essayez de l'ajouter à un nom de relation à la place? .. –

+0

@VaoTsun La [documentation JDBC PostgreSQL] (https://jdbc.postgresql.org/documentation/94/connect.html # connection-parameters): _ "' currentSchema = String' Spécifie le schéma à définir dans le chemin de recherche Ce schéma sera utilisé pour résoudre les noms d'objets non qualifiés utilisés dans les instructions sur cette connexion. "_ –

+0

@ Vao Tsun, en l'ajoutant au nom de la relation? Voulez-vous dire Entité ou Attribut d'annotation Table dans les classes d'entités? mais je veux qu'une classe soit utilisée dans plusieurs schémas. – Mideel

Répondre

1

I J'ai finalement compris par moi-même après avoir combiné quelques résultats de Google, j'espère que c'est utile pour les gens qui sont comme moi. Voici quelques conclusions que j'ai faites.

  1. Ajout du CurrentSchema = mon_schema dans l'élément jdbc-conncetion piscine ne change rien dans JPA si cette connexion est utilisée dans JPA et spécifié dans l'unité de persistance, comme mon exemple précédent:

    java : app/myjndisource

    EntityManager utilise toujours le schéma public et ignore le schéma spécifié.

  2. Nous avons besoin d'utiliser un fichier orm.xml pour spécifier le schéma que nous voulons, comme dans cet exemple:

    JPA - EclipseLink - How to change default schema

    Le fichier orm.xml peut être réglé avec un nom, mais il doit être sur le chemin de classe. Dans NetBeans, vous pouvez utiliser cette structure de dossier par exemple, car vous ne pouvez pas générer ce fichier avec NetBeans intégré dans l'aide.

    Pages Web -> WEB-INF -> Cours -> META-INF -> (les fichiers de mappage)

Netbeans web application structure

Ensuite, dans l'unité de persistance, nous pouvons spécifier le fichier de mappage élément, mais n'oubliez pas ces 2 points

A. Dans NetBeans (ou peut-être d'autres IDES), vous devez placer l'élément mapping-file après l'élément jta-data-source mais avant l'élément class sinon il y aura une erreur de déploiement comme dans ce lien:

https://netbeans.org/bugzilla/show_bug.cgi?id=170348

B. Si vous nommez le fichier de mappage avec le nom orm.xml et l'inclure dans le même répertoire avec votre unité de persistance, automatiquement l'unité de persistance comprend ce fichier de mappage bien que vous ne spécifiez pas avec l'élément mapping-file. Donc, si vous avez 2 fichiers de mapping et l'un d'entre eux nommé orm.xml et que tous les deux contiennent l'élément schema et que votre unité de persistance utilise l'élément mapping-file pour l'autre fichier de mapping, il y aura une erreur. .