java hibernate - Ai-je besoin d'éléments <class> dans persistence.xml?




5 Answers

Le jar-file persistence.xml contient un jar-file que vous pouvez utiliser. À partir du didacticiel Java EE 5 :

<persistence>
    <persistence-unit name="OrderManagement">
        <description>This unit manages orders and customers.
            It does not rely on any vendor-specific features and can
            therefore be deployed to any persistence provider.
        </description>
        <jta-data-source>jdbc/MyOrderDB</jta-data-source>
        <jar-file>MyOrderApp.jar</jar-file>
        <class>com.widgets.Order</class>
        <class>com.widgets.Customer</class>
    </persistence-unit>
</persistence>

Ce fichier définit une unité de persistance nommée OrderManagement , qui utilise une source de données compatible JTA jdbc/MyOrderDB . Les éléments jar-file et class spécifient les classes de persistance gérées: classes d'entités, classes intégrables et superclasses mappées. L'élément jar-file spécifie les fichiers JAR visibles pour l'unité de persistance empaquetée contenant les classes de persistance gérées, tandis que l'élément class nomme explicitement les classes de persistance gérées.

Dans le cas d'Hibernate, jetez un oeil au chapitre 2. Configuration et configuration aussi pour plus de détails.

EDIT: En fait, si cela ne vous dérange pas de ne pas être conforme aux spécifications, Hibernate supporte la détection automatique même dans Java SE. Pour ce faire, ajoutez la propriété hibernate.archive.autodetection :

<persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
  <!-- This is required to be spec compliant, Hibernate however supports
       auto-detection even in JSE.
  <class>pl.michalmech.eventractor.domain.User</class>
  <class>pl.michalmech.eventractor.domain.Address</class>
  <class>pl.michalmech.eventractor.domain.City</class>
  <class>pl.michalmech.eventractor.domain.Country</class>
   -->

  <properties>
    <!-- Scan for annotated classes and Hibernate mapping XML files -->
    <property name="hibernate.archive.autodetection" value="class, hbm"/>

    <property name="hibernate.hbm2ddl.auto" value="validate" />
    <property name="hibernate.show_sql" value="true" />
  </properties>
</persistence-unit>
annotations jpa

J'ai un fichier persistance.xml très simple:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    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_1_0.xsd">

    <persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
        <class>pl.michalmech.eventractor.domain.User</class>
        <class>pl.michalmech.eventractor.domain.Address</class>
        <class>pl.michalmech.eventractor.domain.City</class>
        <class>pl.michalmech.eventractor.domain.Country</class>

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="validate" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>

</persistence>

et il fonctionne.

Mais lorsque je supprime <class> éléments <class> , l'application ne voit pas les entités (toutes les classes sont annotées avec @Entity ).

Existe-t-il un mécanisme automatique pour analyser les classes @Entity ?




Ai-je besoin d'éléments Class dans persistence.xml?

Non, vous ne le faites pas nécessairement. Voici comment vous le faites dans Eclipse (testé par Kepler):

Cliquez avec le bouton droit sur le projet, cliquez sur Propriétés , sélectionnez JPA , dans la case Gestion de la classe de persistance. Découvrez automatiquement les classes annotées .




pour JPA 2+ cela fait l'affaire

 <jar-file></jar-file>

scanne tous les jars en guerre pour les classes annotées @Entity




Vous pouvez fournir jar-file chemin d'élément jar-file vers un dossier contenant des classes compilées. Par exemple, j'ai ajouté quelque chose comme ça quand j'ai préparé persistence.xml à certains tests d'intégration:

 <jar-file>file:../target/classes</jar-file>



Ce n'est pas une solution mais un indice pour ceux qui utilisent Spring:

J'ai essayé d'utiliser org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean avec la définition de persistenceXmlLocation mais avec cela j'ai dû fournir les éléments <class> (même si la persistenceXmlLocation indiquait simplement META-INF/persistence.xml ).

Lorsque je n'utilise pas persistenceXmlLocation je peux omettre ces éléments <class> .




Related