Mam bardzo prosty plik persistance.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 to działa.
Ale kiedy usuwam <class>
elementy, aplikacja nie widzi encji (wszystkie klasy są opatrzone adnotacją @Entity
).
Czy istnieje automatyczny mechanizm skanowania w poszukiwaniu @Entity
zajęć?
W środowisku Java SE, zgodnie ze specyfikacją, musisz określić wszystkie klasy, tak jak zrobiłeś:
i
(JSR-000220 6.2.1.6)
W środowiskach Java EE nie musisz tego robić, ponieważ dostawca skanuje w poszukiwaniu adnotacji.
Nieoficjalnie możesz spróbować ustawić
<exclude-unlisted-classes>false</exclude-unlisted-classes>
plik w pliku persistence.xml. Ten parametr ma wartość domyślnąfalse
w EE itrue
SE. O ile wiem, zarówno EclipseLink, jak i Toplink obsługują to. Ale nie powinieneś polegać na tym, że działa w SE, zgodnie ze specyfikacją, jak podano powyżej.Możesz SPRÓBOWAĆ, co następuje (może, ale nie musi działać w środowiskach SE):
źródło
<exclude-unlisted-classes>false</exclude-unlisted-classes>
nie działało z WildFly 8.2.1.Final + Hibernate 4.3.7Nie, niekoniecznie. Oto jak to się robi w Eclipse (testowane przez Keplera):
Kliknij prawym przyciskiem myszy projekt, kliknij Właściwości , wybierz JPA , w sekcji Zarządzanie klasami trwałości zaznacz Automatycznie wykryj klasy z adnotacjami .
źródło
persistence.xml
że Eclipse generuje.W przypadku użytkowników korzystających z JPA na wiosnę, począwszy od wersji 3.1, można ustawić
packagesToScan
właściwość poniżejLocalContainerEntityManagerFactoryBean
i całkowicie pozbyć się pliku persistence.xml.Oto podsumowanie
źródło
Możesz podać
jar-file
ścieżkę elementu do folderu ze skompilowanymi klasami. Na przykład dodałem coś takiego, gdy przygotowywałem persistence.xml do niektórych testów integracyjnych:źródło
W przypadku JPA 2+ to załatwia sprawę
skanowanie wszystkich słoików na wojnie w poszukiwaniu klas @Entity z adnotacjami
źródło
java.lang.IllegalArgumentException: Unable to visit JAR file:
).Hibernate nie obsługuje w
<exclude-unlisted-classes>false</exclude-unlisted-classes>
ramach SE (inny plakat wspomniał, że działa z TopLink i EclipseLink).Istnieją narzędzia, które automatycznie generują listę klas do persistence.xml, np. Kreator Importuj schemat bazy danych w IntelliJ. Po uzyskaniu początkowych klas projektu w persistence.xml powinno być łatwe ręczne dodawanie / usuwanie pojedynczych klas w miarę postępu projektu.
źródło
Nie jestem pewien, czy robisz coś podobnego do tego, co robię, ale generuję ładunek javy źródłowej z XSD przy użyciu JAXB w osobnym komponencie przy użyciu Maven. Powiedzmy, że ten artefakt nosi nazwę „model podstawowy”
Chciałem zaimportować ten artefakt zawierający źródło Java i uruchomić hibernację dla wszystkich klas w moim pliku jar artefaktu „modelu podstawowego” i nie określać każdej jawnie. Dodam „model podstawowy” jako zależność dla mojego komponentu hibernacji, ale problem polega na tym, że tag w persistence.xml pozwala tylko na określenie ścieżek bezwzględnych.
Sposób, w jaki sobie z tym poradziłem, polega na jawnym skopiowaniu mojej zależności jar "modelu bazowego" do katalogu docelowego, a także na usunięciu jego wersji. Więc podczas gdy jeśli zbuduję mój artefakt „modelu bazowego”, wygeneruje on „base-model-1.0-SNAPSHOT.jar”, krok kopiowania zasobów kopiuje go jako „base-model.jar”.
Więc w pompie dla komponentu hibernacji:
Następnie nazywam wtyczkę hibernacji w następnej fazie „klasy procesów”:
i wreszcie w moim persistence.xml mogę wyraźnie ustawić lokalizację jar w ten sposób:
i dodaj właściwość:
źródło
To nie jest rozwiązanie, ale wskazówka dla osób korzystających ze Springa:
Próbowałem używać
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
z ustawieniem,persistenceXmlLocation
ale przy tym musiałem podać<class>
elementy (nawet jeślipersistenceXmlLocation
właśnie wskazywałyMETA-INF/persistence.xml
).Gdy nie korzystałem
persistenceXmlLocation
, mogłem te<class>
elementy pominąć .źródło
persistenceXmlLocation
właściwości w moichLocalContainerEntityManagerFactoryBean
ustawieniach. Ale wszystkie zapytania działają, nawet jeśli pominę<class>
elementy. Jest na aplikacji Spring / Hibernate / Maven. Ale w swojej wskazówce mówisz, że „Gdy nie używam persistenceXmlLocation, mógłbym pominąć te elementy <class>”. ale dla mnie jest odwrotnie.Nie jestem pewien, czy to rozwiązanie jest poniżej specyfikacji, ale myślę, że mogę podzielić się z innymi.
drzewo zależności
my-entity.jar
Zawiera tylko klasy jednostek. Nie
META-INF/persistence.xml
.my-services.jar
Zależy od
my-entities
. Zawiera tylko EJB.my-resources.jar
Zależy od
my-services
. Zawiera klasy zasobów iMETA-INF/persistence.xml
.problemy
<jar-file/>
element inmy-resources
jako nazwę artefaktu z postfikowaną wersją przejściowej zależności?<jar-file/>
elementu i rzeczywistą zależność przejściową?rozwiązanie
bezpośrednia (nadmiarowa?) zależność i filtrowanie zasobów
Wstawiłem własność i zależność
my-resources/pom.xml
.Teraz
persistence.xml
przygotuj się na filtrowanieWtyczka Maven Enforcer
Dzięki
dependencyConvergence
regule możemy zapewnić, żemy-entities
wersja „jest taka sama zarówno w wersji bezpośredniej jak i przechodniej.źródło
Nie zawsze we wszystkich przypadkach.
Używam Jboss 7.0.8 i Eclipselink 2.7.0. W moim przypadku, aby załadować encje bez dodawania tego samego w persistence.xml, dodałem następującą właściwość systemową w Jboss Standalone XML:
<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
źródło