Czy potrzebuję elementów w wytrwałości?xml?

Mam bardzo prostą wytrwałość.plik xml:

<?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>
I działa.

Ale kiedy usuwam <class> elements aplikacja nie widzi encji(wszystkie klasy są opatrzone adnotacją @Entity).

Czy jest jakiś automatyczny mechanizm do skanowania klas @Entity?

Author: Joshua Taylor, 2009-11-23

10 answers

Wytrwałość.xml ma jar-file, którego możesz użyć. Z samouczka 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>

Ten plik definiuje jednostkę trwałości nazwane OrderManagement, które wykorzystuje JTA-aware data source jdbc/MyOrderDB. Elementy jar-file i class określają zarządzane klasy trwałości: klasy encji, klasy osadzalne i zmapowane klasy nadrzędne. Element jar-file określa pliki JAR, które są widoczne dla packaged persistence unit, zawierające zarządzane klasy trwałości, podczas gdy class element jawnie nazywa zarządzane klasy trwałości.

W przypadku Hibernate zajrzyj do rozdziału . Konfiguracja i konfiguracja również po więcej szczegółów.

EDIT: właściwie, jeśli nie masz nic przeciwko temu, aby nie być zgodnym ze specyfikacją, Hibernate obsługuje automatyczne wykrywanie nawet w Java SE. Aby to zrobić, dodaj właściwość 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>
 76
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-25 12:20:52

W środowisku Java SE, według specyfikacji musisz określić wszystkie klasy tak jak to zrobiłeś:

W środowiskach Java SE należy określić listę wszystkich nazwanych zarządzanych klas trwałości, aby zapewnić przenośność

I

Jeśli nie jest zamierzone, aby adnotowane klasy trwałości zawarte w korzeniu jednostki trwałości były włączone do jednostki trwałości, należy użyć elementu exclude-unlisted-classes. Na exclude-unlisted-classes element nie jest przeznaczony do użytku w środowiskach Java SE.

(JSR-000220 6.2.1.6)

W środowiskach Java EE nie musisz tego robić, ponieważ dostawca skanuje dla Ciebie adnotacje.

Nieoficjalnie, możesz spróbować ustawić <exclude-unlisted-classes>false</exclude-unlisted-classes> w swojej wytrwałości.xml. Parametr ten domyślnie wynosi false W EE i true W SE. Zarówno EclipseLink jak i Toplink wspierają to, o ile wiem. Ale nie należy polegać na tym, że działa w SE, zgodnie ze specyfikacją, jak wspomniano powyżej.

Możesz wypróbować następujące (może działać lub nie w środowiskach SE):

<persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
     <exclude-unlisted-classes>false</exclude-unlisted-classes>

    <properties>
            <property name="hibernate.hbm2ddl.auto" value="validate" />
            <property name="hibernate.show_sql" value="true" />
    </properties>
</persistence-unit>
 40
Author: Mads Mobæk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 20:00:43

Czy potrzebuję elementów klasy w persistence.xml?

Nie, niekoniecznie. Oto jak to zrobić w zaćmieniu (testowany przez Keplera):

Kliknij prawym przyciskiem myszy projekt, kliknij Properties , Wybierz JPA , w Zarządzanie klasami trwałości zaznacz Odkryj automatycznie klasy z komentarzami.

Tutaj wpisz opis obrazka

 14
Author: abbas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-23 17:29:47

Dla osób uruchamiających JPA na wiosnę, począwszy od wersji 3.1, możesz ustawić właściwość packagesToScan Pod LocalContainerEntityManagerFactoryBean i pozbyć się persistence./ align = "left" /

Tu jest low-down

 9
Author: Christopher Yang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 10:39:23

Dla JPA 2 + to robi sztuczkę

 <jar-file></jar-file>

Skanuj wszystkie słoiki w war w poszukiwaniu klas adnotacji @ Entity

 7
Author: eriskooo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-18 09:02:29

Hibernate nie obsługuje <exclude-unlisted-classes>false</exclude-unlisted-classes> Pod SE, (inny plakat wspomniał, że działa z TopLink i EclipseLink).

Istnieją narzędzia, które automatycznie wygenerują listę klas do persistence.xml np. Kreator schematu importu bazy danych w IntelliJ. Gdy już masz wstępne zajęcia w projekcie w wytrwałości.xml powinno być proste dodawanie/usuwanie pojedynczych klas ręcznie w miarę postępu projektu.

 6
Author: Chuck Stephanski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 05:33:44

Możesz podać ścieżkę elementu jar-file do folderu ze skompilowanymi klasami. Na przykład dodałem coś takiego, gdy przygotowywałem uporczywość.xml do niektórych testów integracyjnych:

 <jar-file>file:../target/classes</jar-file>
 6
Author: Arek Trzepacz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-25 09:43:13

Nie jestem pewien, czy robisz coś podobnego do tego, co ja robię, ale generuję obciążenie źródłowej Javy z XSD za pomocą JAXB w oddzielnym komponencie za pomocą Mavena. Powiedzmy, że ten artefakt nazywa się "base-model"

Chciałem zaimportować ten artefakt zawierający źródło Javy i uruchomić hibernate na wszystkich klasach w moim" base-model " Artifact jar i nie określać każdego bezpośrednio. Dodaję" base-model " jako zależność dla mojego komponentu hibernate, ale problem polega na tym, że tag w wytrwałość.xml pozwala tylko określić ścieżki bezwzględne.

Sposób, w jaki obejrzałem to polega na skopiowaniu mojego" base-model " zależności jar explictly do mojego docelowego katalogu i również rozebrać jego wersję. Jeśli więc zbuduję swój artefakt "base-model", wygeneruje on "Base-model-1.0-SNAPSHOT".jar", krok copy-resources kopiuje go jako " base-model.jar".

Więc w Twoim pom dla komponentu hibernate:

            <!-- We want to copy across all our artifacts containing java code
        generated from our scheams. We copy them across and strip the version
        so that our persistence.xml can reference them directly in the tag
        <jar-file>target/dependency/${artifactId}.jar</jar-file> -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.5.1</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                </execution>
            </executions>       
            <configuration>
                <includeArtifactIds>base-model</includeArtifactIds>
                <stripVersion>true</stripVersion>
            </configuration>        
        </plugin>

Następnie wywołuję wtyczkę hibernate w następnej fazie "proces-klasy": {]}

            <!-- Generate the schema DDL -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>hibernate3-maven-plugin</artifactId>
            <version>2.2</version>

            <executions>
                <execution>
                    <id>generate-ddl</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>hbm2ddl</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <components>
                    <component>
                        <name>hbm2java</name>
                        <implementation>annotationconfiguration</implementation>
                        <outputDirectory>/src/main/java</outputDirectory>
                    </component>
                </components>
                <componentProperties>
                    <persistenceunit>mysql</persistenceunit>
                    <implementation>jpaconfiguration</implementation>
                    <create>true</create>
                    <export>false</export>
                    <drop>true</drop>
                    <outputfilename>mysql-schema.sql</outputfilename>
                </componentProperties>
            </configuration>
        </plugin>
I w końcu w mojej wytrwałości.xml mogę jawnie ustawić lokalizację jar w ten sposób:
<jar-file>target/dependency/base-model.jar</jar-file>

I dodaj właściwość:

<property name="hibernate.archive.autodetection" value="class, hbm"/>
 4
Author: Spencer Loveridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 22:22:30

To nie jest rozwiązanie, ale podpowiedź dla tych, którzy używają sprężyny:

Próbowałem użyć org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean z ustawieniem persistenceXmlLocation, ale z tym musiałem podać <class> elementy (nawet jeśli persistenceXmlLocation wskazywało na META-INF/persistence.xml).

Gdy Nie używając persistenceXmlLocation mógłbym pominąć te <class> elementy.

 2
Author: Ethan Leroy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 09:33:50

Nie jestem pewien, czy to rozwiązanie jest zgodne ze specyfikacją, ale myślę, że mogę podzielić się z innymi.

Drzewo zależności

My-byty.jar

Zawiera tylko klasy encji. Nie META-INF/persistence.xml.

Moje-usługi.jar

Zależy od my-entities. Zawiera tylko EJB.

Moje-zasoby.jar

Zależy od my-services. Zawiera klasy zasobów i META-INF/persistence.xml.

Problemy

  • Jak możemy określić <jar-file/> element w my-resources jako artefakt version-postfixed nazwa przejściowej zależności?
  • Jak możemy zsynchronizować wartość <jar-file/> elementu z rzeczywistą zależnością przejściową?

Rozwiązanie

Direct (redundant?) filtrowanie zależności i zasobów

Dodaję właściwość i zależność do my-resources/pom.xml.

<properties>
  <my-entities.version>x.y.z-SNAPSHOT</my-entities.version>
</properties>
<dependencies>
  <dependency>
    <!-- this is actually a transitive dependency -->
    <groupId>...</groupId>
    <artifactId>my-entities</artifactId>
    <version>${my-entities.version}</version>
    <scope>compile</scope> <!-- other values won't work -->
  </dependency>
  <dependency>
    <groupId>...</groupId>
    <artifactId>my-services</artifactId>
    <version>some.very.sepecific</version>
    <scope>compile</scope>
  </dependency>
<dependencies>

Teraz przygotuj persistence.xml do filtrowania

<?xml version="1.0" encoding="UTF-8"?>
<persistence ...>
  <persistence-unit name="myPU" transaction-type="JTA">
    ...
    <jar-file>lib/my-entities-${my-entities.version}.jar</jar-file>
    ...
  </persistence-unit>
</persistence>

Maven Enforcer Plugin

Z regułą dependencyConvergence możemy zapewnić, że wersja my-entities ' jest taka sama zarówno w wersji bezpośredniej, jak i przechodni.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-enforcer-plugin</artifactId>
  <version>1.4.1</version>
  <executions>
    <execution>
      <id>enforce</id>
      <configuration>
        <rules>
           <dependencyConvergence/>
        </rules>
      </configuration>
      <goals>
        <goal>enforce</goal>
      </goals>
    </execution>
  </executions>
</plugin>
 1
Author: Jin Kwon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-16 13:12:05