Saya memiliki file persistance.xml yang sangat sederhana:
<?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>
dan berhasil.
Tetapi ketika saya menghapus <class>
elemen aplikasi tidak melihat entitas (semua kelas dianotasi dengan @Entity
).
Apakah ada mekanisme otomatis untuk memindai @Entity
kelas?
Di lingkungan Java SE, dengan spesifikasi Anda harus menentukan semua kelas seperti yang telah Anda lakukan:
dan
(JSR-000220 6.2.1.6)
Di lingkungan Java EE, Anda tidak perlu melakukan ini karena penyedia memindai anotasi untuk Anda.
Secara tidak resmi, Anda dapat mencoba menyetel
<exclude-unlisted-classes>false</exclude-unlisted-classes>
di persistence.xml Anda. Parameter ini secara defaultfalse
di EE dantrue
SE. Baik EclipseLink dan Toplink mendukung ini sejauh yang saya tahu. Tetapi Anda tidak harus mengandalkannya bekerja di SE, menurut spesifikasi, seperti yang dinyatakan di atas.Anda dapat MENCOBA berikut ini (mungkin atau mungkin tidak bekerja di lingkungan SE):
sumber
<exclude-unlisted-classes>false</exclude-unlisted-classes>
tidak bekerja dengan WildFly 8.2.1. Final + Hibernate 4.3.7Tidak, Anda belum tentu. Inilah cara Anda melakukannya di Eclipse (diuji Kepler):
Klik kanan pada proyek, klik Properties , pilih JPA , di manajemen kelas Persistence centang Temukan kelas beranotasi secara otomatis .
sumber
persistence.xml
yang dihasilkan Eclipse.Untuk mereka yang menjalankan JPA di Spring, dari versi 3.1 dan seterusnya, Anda dapat menyetel
packagesToScan
properti di bawahLocalContainerEntityManagerFactoryBean
dan menghapus persistence.xml sekaligus.Inilah bagian bawahnya
sumber
Anda dapat menyediakan
jar-file
jalur elemen ke folder dengan kelas yang dikompilasi. Misalnya saya menambahkan sesuatu seperti itu ketika saya menyiapkan persistence.xml ke beberapa tes integrasi:sumber
untuk JPA 2+ ini berhasil
pindai semua toples dalam perang untuk mencari kelas @Entity beranotasi
sumber
java.lang.IllegalArgumentException: Unable to visit JAR file:
).Hibernate tidak mendukung di
<exclude-unlisted-classes>false</exclude-unlisted-classes>
bawah SE, (poster lain menyebutkan ini berfungsi dengan TopLink dan EclipseLink).Ada alat yang akan menghasilkan daftar kelas secara otomatis ke persistence.xml misalnya wizard Import Database Schema di IntelliJ. Setelah Anda mendapatkan kelas awal proyek Anda di persistence.xml, semestinya mudah untuk menambahkan / menghapus satu kelas secara manual saat proyek Anda berjalan.
sumber
Tidak yakin apakah Anda melakukan sesuatu yang mirip dengan apa yang saya lakukan, tetapi Im menghasilkan beban java sumber dari XSD menggunakan JAXB dalam komponen terpisah menggunakan Maven. Katakanlah artefak ini disebut "model-dasar"
Saya ingin mengimpor artefak ini yang berisi sumber java dan menjalankan hibernasi di semua kelas di toples artefak "model dasar" saya dan tidak menentukan masing-masing secara eksplisit. Saya menambahkan "model-dasar" sebagai ketergantungan untuk komponen hibernasi saya, tetapi masalahnya adalah tag di persistence.xml hanya memungkinkan Anda untuk menentukan jalur absolut.
Cara saya mengatasinya adalah dengan menyalin ketergantungan jar "model dasar" saya secara eksplisit ke direktori target saya dan juga menghapus versinya. Jadi jika saya membangun artefak "model-dasar", ia menghasilkan "model-dasar-1.0-SNAPSHOT.jar", langkah sumber-salinan menyalinnya sebagai "basis-model.jar".
Jadi di pom Anda untuk komponen hibernasi:
Kemudian saya memanggil plugin hibernate di tahap berikutnya "kelas proses":
dan akhirnya di persistence.xml saya, saya dapat secara eksplisit mengatur lokasi jar sebagai:
dan tambahkan properti:
sumber
Ini bukan solusi tapi petunjuk bagi mereka yang menggunakan Spring:
Saya mencoba menggunakan
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
dengan pengaturanpersistenceXmlLocation
tetapi dengan ini saya harus menyediakan<class>
elemen (bahkan jikapersistenceXmlLocation
hanya menunjukMETA-INF/persistence.xml
).Saat tidak menggunakan,
persistenceXmlLocation
saya bisa menghilangkan<class>
elemen ini .sumber
persistenceXmlLocation
properti dalamLocalContainerEntityManagerFactoryBean
pengaturan saya . Tetapi semua kueri berfungsi bahkan jika saya menghilangkan<class>
elemen. Ini pada aplikasi Spring / Hibernate / Maven. Tapi dalam petunjuk Anda, Anda mengatakan bahwa "Saat tidak menggunakan persistenceXmlLocation saya bisa menghilangkan elemen <class> ini." tapi itu sebaliknya bagiku.Saya tidak yakin solusi ini sesuai dengan spesifikasi tetapi saya rasa saya dapat membagikan untuk orang lain.
pohon ketergantungan
my-entity.jar
Berisi kelas entitas saja. Tidak
META-INF/persistence.xml
.my-services.jar
Tergantung
my-entities
. Berisi EJB saja.my-resources.jar
Tergantung
my-services
. Berisi kelas sumber daya danMETA-INF/persistence.xml
.masalah
<jar-file/>
elemenmy-resources
sebagai nama artefak versi-postfixed dari ketergantungan sementara?<jar-file/>
elemen dan dependensi transien sebenarnya?larutan
ketergantungan langsung (redundan?) dan pemfilteran resource
Saya memasukkan properti dan ketergantungan
my-resources/pom.xml
.Sekarang
persistence.xml
bersiaplah untuk disaringPlugin Maven Enforcer
Dengan
dependencyConvergence
aturan tersebut, kami dapat memastikan bahwamy-entities
'versinya sama baik secara langsung maupun transitif.sumber
Tidak selalu dalam semua kasus.
Saya menggunakan Jboss 7.0.8 dan Eclipselink 2.7.0. Dalam kasus saya untuk memuat entitas tanpa menambahkan hal yang sama di persistence.xml, saya menambahkan properti sistem berikut di Jboss Standalone XML:
<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
sumber