क्या मुझे pers.ence.xml में <class> तत्वों की आवश्यकता है?


110

मेरे पास बहुत सरल दृढ़ता है। 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>

और यह काम करता है।

लेकिन जब मैं <class>एलिमेंट्स को हटाता हूं तो एंटिटीज़ नहीं दिखतीं (सभी क्लासेस एनोटेट हो जाती हैं @Entity)।

क्या @Entityकक्षाओं के लिए स्कैन करने के लिए कोई स्वचालित तंत्र है ?

जवाबों:


78

दृढ़ता। Xml का jar-fileउपयोग आप कर सकते हैं। से जावा 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>

यह फ़ाइल नाम की एक दृढ़ता इकाई को परिभाषित करती है OrderManagement, जो JTA- जागरूक डेटा स्रोत का उपयोग करती है jdbc/MyOrderDBjar-fileऔर classइकाई कक्षाएं, एम्बेड करने योग्य वर्गों, और मैप की सुपर-क्लास: तत्वों हठ कक्षाओं में कामयाब निर्दिष्ट करें। jar-fileतत्व निर्दिष्ट जार फ़ाइलों को पैक हठ इकाई है कि कक्षाओं हठ कामयाब समाहित किए हुए दिखाई दे रहे हैं, जबकि classकक्षाएं हठ कामयाब तत्व का नाम स्पष्ट।

हाइबरनेट के मामले में, अध्याय 2 पर एक नज़र डालें अधिक विवरण के लिए सेटअप और कॉन्फ़िगरेशन भी।

संपादित करें: वास्तव में, यदि आप बुरा नहीं मानते हैं, तो हाइबरनेट जावा एसई में भी ऑटो-डिटेक्शन का समर्थन करता है। ऐसा करने के लिए, 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>

13
मैं देखता हूं, लेकिन इकाइयां (@Entity) अलग मावेन परियोजना में हैं, इसलिए जार-फ़ाइल का नाम हर बिल्ड पर बदल सकता है। मैं विशिष्ट पैकेज या क्लासपैथ में सभी को स्कैन करने के लिए कुछ देख रहा हूं। मैं बहुत से टाइप करने के लिए आलसी हूं, दृढ़ता में कई <class> तत्व।
माइकल मेक

हर निर्माण पर ?! मैं यह भी नहीं पूछूंगा कि लेकिन ... आप इसे हल करने के लिए फ़िल्टरिंग का उपयोग कर सकते हैं।
पास्कल थिवेंट

हर कोई बिल्कुल नहीं, लेकिन मैं बदलावों के प्रति प्रतिरोधी होना चाहता हूं।
माइकल मेक

5
प्राचीन सूत्र, मुझे पता है, लेकिन jpa-maven-plugin पर एक नज़र है ।
लैयर्ड नेल्सन

आप persistence.xml में <मानचित्रण-फ़ाइल> तत्व (जिसमें संस्थाओं की सूची शामिल है) का उपयोग कर सकते हैं, इसलिए आप उपयोग की गई फ़ाइलों का एक ही नाम रख सकते हैं और उन्हें संदर्भित जार के निर्माण में एकीकृत कर सकते हैं।
med_alpa

44

में जावा SE पर्यावरण, विनिर्देश द्वारा आप सभी वर्गों में बताने की के रूप में आप क्या किया है:

पोर्टेबिलिटी का बीमा करने के लिए जावा एसई वातावरण में सभी नामित प्रबंधित दृढ़ता कक्षाओं की एक सूची निर्दिष्ट की जानी चाहिए

तथा

यदि यह इरादा नहीं है कि हठ इकाई की जड़ में निहित एनोटेट दृढ़ता वाले वर्गों को दृढ़ता इकाई में शामिल किया गया है, तो बहिष्कृत-असूचीबद्ध-वर्ग तत्व का उपयोग किया जाना चाहिए। Java SE वातावरण में उपयोग के लिए बहिष्कृत-असूचीबद्ध-वर्ग तत्व अभिप्रेत नहीं है।

(JSR-000220 6.2.1.6)

में जावा ईई वातावरण, आप नहीं है आप के लिए एनोटेशन के लिए प्रदाता स्कैन के रूप में यह करने के लिए किया है।

अनौपचारिक रूप से, आप <exclude-unlisted-classes>false</exclude-unlisted-classes>अपनी दृढ़ता में निर्धारित करने का प्रयास कर सकते हैं । xml। यह पैरामीटर falseईई और trueएसई में चूक करता है । EclipseLink और Toplink दोनों इसका समर्थन करते हैं जहां तक ​​मैं बता सकता हूं। लेकिन आपको एसई पर काम करने पर भरोसा नहीं करना चाहिए, जैसा कि ऊपर कहा गया है।

आप निम्नलिखित की कोशिश कर सकते हैं (एसई-वातावरण में काम कर सकते हैं या नहीं भी कर सकते हैं):

<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>

2
<exclude-unlisted-classes>false</exclude-unlisted-classes>WildFly 8.2.1.Final + हाइबरनेट 4.3.7 के साथ काम नहीं किया
एंड्रियास Dietrich

12

क्या मुझे pers.ence में वर्ग तत्वों की आवश्यकता है।

नहीं, आप जरूरी नहीं है। यहाँ आप इसे ग्रहण (केप्लर परीक्षण) में कैसे करते हैं:

सही परियोजना पर क्लिक करें, गुण , का चयन जेपीए , में हठ वर्ग प्रबंधन टिक डिस्कवर स्वचालित रूप से कक्षाओं एनोटेट

यहां छवि विवरण दर्ज करें


9
उखाड़ना क्यों? ओपी ने ग्रहण का भी उल्लेख नहीं किया है और यह उत्तर यह नहीं दिखाता है कि यह ग्रहण सुविधा हुड के नीचे क्या करती है ताकि कोई आईडीई को मिटा सके।
आर्टेम नोविकोव

2
@Artem Novikov: मुझे यह कठोर लगता है क्योंकि अक्सर यह सवाल अलग-अलग वातावरणों में उठता है और यहाँ हम मदद करना चाहते हैं या संकेत देते हैं जो उपयोगी हैं! (मेरे लिए जैसे) यह उपयोगी है क्योंकि ग्रहण इस तरह के विकास के लिए एक सामान्य आईडीई है और हुड के तहत इतना महत्वपूर्ण नहीं है, लेकिन मुझे लगता है कि इसमें सभी प्रासंगिक कार्यक्षेत्र परियोजनाएं शामिल होंगी (जैसे मेरी परियोजना निर्भर है)।
एंड्रियास डिट्रीच

stackoverflow.com/questions/17951297/... अच्छा चाल, लेकिन जाहिरा तौर पर यह केवल तभी कारगर साबित संस्थाओं persistence.xml रूप में एक ही classloader में समाप्त
Pierluigi Vernetto

@abbas कृपया दिखाएं persistence.xmlकि ग्रहण उत्पन्न होता है।
Frans

12

वसंत में जेपीए को चलाने वाले लोगों के लिए, संस्करण 3.1 से, आप इसके packagesToScanतहत संपत्ति निर्धारित कर सकते हैं LocalContainerEntityManagerFactoryBeanऔर दृढ़ता से छुटकारा पा सकते हैं।

यहाँ नीचे-नीचे है


मेरे लिए काम किया! परिदृश्य वसंत 4 + हाइबरनेट + jpa2 + मावेन था। JUnit परीक्षण को मेरी इकाइयाँ नहीं मिलीं लेकिन इस सेटिंग के साथ इसने काम किया।
साता

8

आप jar-fileसंकलित कक्षाओं के साथ एक फ़ोल्डर में तत्व पथ के लिए प्रदान कर सकते हैं । उदाहरण के लिए मैंने कुछ ऐसा जोड़ा जब मैंने कुछ एकीकरण परीक्षणों के लिए हठ तैयार किया।

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

यह वही है जिसे मैं देख रहा था!
xtian

EclipseLink के साथ भी काम करता है!
बोम्बे

8

JPA 2+ के लिए यह ट्रिक करता है

 <jar-file></jar-file>

एनोटेट @ एनेटिटी कक्षाओं के लिए युद्ध में सभी जार को स्कैन करें


2
क्या आपको इसके बारे में अधिक जानकारी है? क्या यह दुर्घटना से काम करता है या क्या यह विनिर्देशन में लिखा गया है? क्या यह कार्यान्वयन पर निर्भर है?
मार्कस

स्कैनर क्लास में है AbstractScannerImpl, हाइबरनेट - कोई विचार नहीं है अगर यह बग या फीचर है, तो क्षमा करें
eriskooo

1
Hibernate 5.1.2.Final के साथ जावा एसई में, यह समाधान काम नहीं करता है। हाइबरनेट एक जार फ़ाइल नाम ( java.lang.IllegalArgumentException: Unable to visit JAR file:) की अपेक्षा करता है ।
Stephan

1
काम करता है! :) वाइल्डली 8.2.1 के साथ। फ़ाइनल + हाइबरनेट 4.3.7। फ़ाइनल
एंड्रियास

Thx आदमी, बहुत खोजा और यह सबसे साफ समाधान उपलब्ध है। Wildfly10 + हाइबरनेट 5.0.7 काम कर रहा है।
बट्टा

7

हाइबरनेट <exclude-unlisted-classes>false</exclude-unlisted-classes>एसई के तहत समर्थन नहीं करता है , (एक अन्य पोस्टर ने इस काम का उल्लेख टॉपलिंक और एक्लिप्सलिंक के साथ किया है)।

ऐसे उपकरण हैं जो IntelliJ में इंपोर्ट डेटाबेस स्कीमा विज़ार्ड जैसे उदाहरण के लिए persistence.xml के लिए कक्षाओं की सूची ऑटो-जेनरेट करेंगे। एक बार जब आप अपनी परियोजना की प्रारंभिक कक्षाओं को जारी रख लेते हैं, तो आपकी परियोजना के प्रगति के अनुसार एकल कक्षाओं को हाथ से जोड़ना / हटाना सरल होना चाहिए।


जावा एसई में संस्थाओं का ऑटो पता लगाना सिर्फ जेपीए का हिस्सा नहीं है। इस पर निर्भर अनुप्रयोग पोर्टेबल नहीं हैं।
पास्कल थिवेंट

4

सुनिश्चित नहीं हैं कि आप जो कुछ कर रहे हैं, उसके समान ही हैं, लेकिन Im एक XSD से सोर्स जावा का भार जेनरेट कर रहा है, जो JENB का उपयोग करते हुए एक अलग घटक में मावेन का उपयोग कर रहा है। बता दें कि इस विरूपण साक्ष्य को "बेस-मॉडल" कहा जाता है

मैं जावा स्रोत वाले इस विरूपण साक्ष्य को आयात करना चाहता था और अपने "बेस-मॉडल" विरूपण साक्ष्य जार में सभी वर्गों पर हाइबरनेट चलाना और प्रत्येक को स्पष्ट रूप से निर्दिष्ट नहीं करना चाहता था। Im "हाइबरनेट घटक के लिए एक निर्भरता के रूप में" बेस-मॉडल "जोड़ रहा है लेकिन परेशानी दृढ़ता में टैग है। xml केवल आपको पूर्ण पथ निर्दिष्ट करने की अनुमति देता है।

जिस तरह से मुझे यह मिला, वह है मेरे "बेस-मॉडल" जार निर्भरता की नकल करना, मेरे लक्ष्य डायर की खोज करना और उसका संस्करण भी निकालना। इसलिए जब मैं अपनी "बेस-मॉडल" कलाकृति का निर्माण करता हूं तो यह "बेस-मॉडल-1.0-SNAPSHOT.jar" उत्पन्न करता है, कॉपी-रिसोर्स चरण इसे "बेस-मॉडल.जर" के रूप में कॉपी करता है।

हाइबरनेट घटक के लिए अपने पोम में:

            <!-- 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>

फिर मैं अगले चरण "प्रोसेस-क्लास" में हाइबरनेट प्लगइन को कॉल करता हूं:

            <!-- 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>

और अंत में मेरे हठ में। xml मैं स्पष्ट रूप से जार का स्थान निर्धारित कर सकता हूं:

<jar-file>target/dependency/base-model.jar</jar-file>

और संपत्ति जोड़ें:

<property name="hibernate.archive.autodetection" value="class, hbm"/>

3

यह एक समाधान नहीं है, लेकिन वसंत का उपयोग करने वालों के लिए एक संकेत है:

मैंने org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanसेटिंग के साथ उपयोग करने की कोशिश की, persistenceXmlLocationलेकिन इसके साथ मुझे <class>तत्वों को प्रदान करना था (भले ही persistenceXmlLocationअभी बताया गया हो META-INF/persistence.xml)।

जब मैं इन तत्वों का उपयोग नहीं कर persistenceXmlLocationसकता था <class>


मैंने persistenceXmlLocationअपनी LocalContainerEntityManagerFactoryBeanसेटिंग में प्रॉपर्टी का इस्तेमाल किया । लेकिन सभी प्रश्न काम कर रहे हैं भले ही मैं <class>तत्वों को छोड़ दूं । एक स्प्रिंग / हाइबरनेट / मावेन एप्लीकेशन पर। लेकिन आप में संकेत है कि आप कहते हैं "जब दृढ़ता का उपयोग नहीं कर रहा हूंLLocation मैं इन <वर्ग> तत्वों को छोड़ सकता है।" लेकिन इसका दूसरा तरीका मेरे लिए है।
लकी

@ ईथन आप सही कह रहे हैं, क्योंकि persistenceXmlLocation पैकेजों को ओवरराइड करता है - यदि आप स्रोतों में देखें। तो संकुल का उपयोग करते समय इसका उपयोग न करें।
आर्टेम नोविकोव

2

मुझे यकीन नहीं है कि यह समाधान कल्पना के तहत है, लेकिन मुझे लगता है कि मैं दूसरों के लिए साझा कर सकता हूं।

निर्भरता का पेड़

मेरी-entities.jar

केवल इकाई वर्ग समाहित करता है। नहीं META-INF/persistence.xml

मेरी-services.jar

पर निर्भर करता है my-entities। इसमें केवल EJB शामिल हैं।

मेरी-resources.jar

पर निर्भर करता है my-services। संसाधन वर्ग और शामिल हैं META-INF/persistence.xml

समस्या

  • हम एक क्षणिक निर्भरता के संस्करण-पश्चात विरूपण साक्ष्य नाम के रूप <jar-file/>में तत्व कैसे निर्दिष्ट कर सकते हैं my-resources?
  • हम <jar-file/>तत्व के मूल्य और वास्तविक क्षणिक निर्भरता को कैसे सिंक कर सकते हैं ?

उपाय

प्रत्यक्ष (निरर्थक?) निर्भरता और संसाधन फ़िल्टरिंग

मैंने एक संपत्ति और एक निर्भरता में डाल दिया 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>

अब persistence.xmlछानने के लिए तैयार हो जाओ

<?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>

मावेन एनफोर्सर प्लगिन

dependencyConvergenceनियम के साथ , हम आश्वस्त कर सकते हैं कि my-entities'संस्करण प्रत्यक्ष और सकर्मक दोनों में समान है।

<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>

0

जरूरी नहीं कि सभी मामलों में।

मैं Jboss 7.0.8 और Eclipselink 2.7.0 का उपयोग कर रहा हूं। अपने मामले में दृढ़ता के बिना संस्थाओं को लोड करने के लिए। Iml में, मैंने Jboss स्टैंडबाय XML में निम्नलिखित सिस्टम गुण जोड़ा:

<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.