আমার কি দৃistence়তা.এক্সএমএলে <ক্লাস> উপাদান প্রয়োজন?


110

আমার কাছে খুব সাধারণ দৃ pers়তা.এক্সএমএল ফাইল রয়েছে:

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

দৃistence়তা.এক্সএমএল এর একটি 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একটি জেটিএ-সচেতন ডেটা উত্স ব্যবহার করে, নামের একটি অধ্যবসায় ইউনিট সংজ্ঞা দেয় jdbc/MyOrderDBjar-fileএবং classসত্তা ক্লাস, এম্বেডযোগ্য ক্লাস, এবং ম্যাপ superclasses: উপাদানের অধ্যবসায় শ্রেণীর পরিচালিত উল্লেখ করুন। jar-fileউপাদান নির্দিষ্ট করে JAR- র ফাইল প্যাকেজ অধ্যবসায় ইউনিট যে শ্রেণীর অধ্যবসায় পরিচালিত থাকে কাছে দৃশ্যমান, যখন classক্লাস অধ্যবসায় পরিচালিত উপাদান স্পষ্টভাবে নাম থাকবে না।

হাইবারনেটের ক্ষেত্রে অধ্যায় 2 দেখুন a আরও বিশদ জন্য সেটআপ এবং কনফিগারেশন

সম্পাদনা: প্রকৃতপক্ষে, আপনি যদি বিশেষভাবে অনুগত না হয়ে থাকেন তবে হাইবারনেট জাভা এসই-তে এমনকি স্বয়ংক্রিয় সনাক্তকরণকে সমর্থন করে। এটি করার জন্য, 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
আমি দেখতে পাচ্ছি, কিন্তু সত্তা (@ এন্টিটি) পৃথক মাভেন প্রকল্পে রয়েছে, তাই প্রতিটি বিল্ডে জার-ফাইলের নাম পরিবর্তন করতে পারে। আমি নির্দিষ্ট প্যাকেজ বা শ্রেণিপথগুলিতে সমস্ত স্ক্যান করতে কিছু দেখছি। আমি দৃ pers়তা.এক্সএমএল ফাইলটিতে অনেকগুলি, অনেক <class> উপাদানগুলি টাইপ করতে অলস।
মাইচা মেচ

প্রতিটি বিল্ড ?? আমি জিজ্ঞাসা করব না কেন তবে ... আপনি এটি সমাধান করতে ফিল্টারিং ব্যবহার করতে পারেন।
পাস্কাল থিভেন্ট

সবাই ঠিক না তবে আমি পরিবর্তনের প্রতিরোধী হতে চাই।
মিশা মেচ

5
প্রাচীন থ্রেড, আমি জানি, তবে জেপিএ-ম্যাভেন-প্লাগইনটি দেখুন
লেয়ার্ড নেলসন

আপনি <mapping-file> উপাদানটি (যা সত্তার তালিকা রয়েছে) অধ্যবসায়.এক্সএমএল ব্যবহার করতে পারেন, যাতে আপনি ব্যবহৃত ফাইলগুলির একই নাম রাখতে পারেন এবং সেগুলি রেফারেন্সযুক্ত জারগুলিতে তৈরি করতে পারেন।
মেড_লপা

44

ইন জাভা SE পরিবেশ, স্পেসিফিকেশন দ্বারা আপনাকে সব শ্রেণীর নির্দিষ্ট করতে হবে হিসাবে আপনি কাজ করেছেন:

বহনযোগ্যতা বীমাকরণের জন্য জাভা এসই পরিবেশে সমস্ত নামযুক্ত পরিচালিত অধ্যবসায় ক্লাসগুলির একটি তালিকা অবশ্যই নির্দিষ্ট করতে হবে

এবং

যদি এটির উদ্দেশ্য না হয় যে দৃ the়তা ইউনিটের মূলের মধ্যে থাকা টিকাশী অধ্যবসায় ক্লাসগুলি অধ্যবসায়ী ইউনিটে অন্তর্ভুক্ত করা উচিত, তবে বাদ দিন-তালিকাভুক্ত-শ্রেণীর উপাদানটি ব্যবহার করা উচিত। বাদ দেওয়া-তালিকাভুক্ত-শ্রেণীর উপাদান জাভা এসই পরিবেশে ব্যবহারের উদ্দেশ্যে নয়।

(জেএসআর -000220 6.2.1.6)

ইন জাভা EE পরিবেশের, আপনি না আপনার জন্য টীকা জন্য প্রদানকারীর স্ক্যান হিসাবে এই করতে হবে।

আনুষ্ঠানিকভাবে, আপনি <exclude-unlisted-classes>false</exclude-unlisted-classes>আপনার অধ্যবসায়। Xml সেট করার চেষ্টা করতে পারেন । এই প্যারামিটারটি falseEE এবং trueSE তে ডিফল্ট হয় । উভয় 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>ওয়াইল্ডফ্লাই 8.2.1 এর সাথে কাজ করেনি F ফাইনাল + হাইবারনেট ৪.৩..7
আন্দ্রেস ডায়েটরিচ

12

আমার কি দৃ.়তা.এক্সএমএল ক্লাস উপাদানগুলির প্রয়োজন?

না, আপনি অগত্যা না। আপনি কীভাবে এটি Eclipse এ করেন (কেপলার পরীক্ষিত):

রাইট প্রকল্পের ক্লিক করুন, ক্লিক প্রোপার্টি নির্বাচন JPA মধ্যে অধ্যবসায় বর্গ ব্যবস্থাপনা টিক আবিষ্কার স্বয়ংক্রিয়ভাবে শ্রেণীর সটীক

এখানে চিত্র বর্ণনা লিখুন


9
কেন আপভোট? ওপিও গ্রহণের কথা উল্লেখ করে না এবং এই উত্তরটি প্রদর্শন করে না যে এই গ্রহপ বৈশিষ্ট্যটি হুডের নীচে কী করে যাতে কোনও আইডিই না করে যে কেউ এটি করতে পারে।
আর্টেম নোভিকভ

2
@ আর্টেম নোভিকভ: আমি এটিকে কঠোর বলে মনে করি যেহেতু প্রায়শই বিভিন্ন পরিবেশ নিয়ে প্রশ্ন উত্থাপিত হয় এবং আমরা এখানে দরকারী বা ইঙ্গিতগুলি কার্যকর করতে চাই! (আমার মতো) এটি কার্যকর যেহেতু গ্রহপৃষ্ঠটি এ জাতীয় বিকাশের জন্য একটি সাধারণ আইডিই এবং হুডের নীচে এত গুরুত্বপূর্ণ নয় তবে আমার ধারণা এটিতে সমস্ত প্রাসঙ্গিক ওয়ার্কস্পেস প্রকল্প অন্তর্ভুক্ত থাকবে (যেমন আমার প্রকল্পের উপর নির্ভর করে)।
Andreas Dietrich

stackoverflow.com/questions/17951297/… দুর্দান্ত কৌশল, কিন্তু দৃশ্যত এটি কেবল তখনই কাজ করে যদি সত্তাগুলি অধ্যবসায় হিসাবে একই শ্রেণিবদ্ধে শেষ হয়। xML
পিয়ারলুইগি ভার্নেটো

@ আব্বাস দয়া করে persistence.xmlসেই গ্রহগ্রহের উত্সটি দেখান ।
ফ্রান্স

12

স্প্রিং-এ জেপিএ চালাচ্ছেন তাদের জন্য, সংস্করণ 3.1 থেকে, আপনি packagesToScanনীচে সম্পত্তি সেট করতে পারেন LocalContainerEntityManagerFactoryBeanএবং সম্পূর্ণরূপে দৃ.়তা.এক্সএমএল থেকে মুক্তি পেতে পারেন।

এখানে নিচে ডাউন


আমার জন্য কাজ! দৃশ্যটি ছিল বসন্ত 4 + হাইবারনেট + জেপি 2 + ম্যাভেন। JUnit টেস্টিং আমার সত্তাগুলি খুঁজে পায় নি তবে এই সেটিংয়ের সাথে এটি কাজ করে।
সাত

8

আপনি jar-fileসংকলিত ক্লাস সহ একটি ফোল্ডারে মৌলিক পথ সরবরাহ করতে পারেন । উদাহরণস্বরূপ, আমি যখন কিছু ইন্টিগ্রেশন পরীক্ষায় দৃ.়তা.এক্সএমএল প্রস্তুত করি তখন আমি এরকম কিছু যুক্ত করেছি:

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

এটাই আমি খুঁজছিলাম!
xtian

EclipseLink নিয়েও কাজ করে!
বোম্বে

8

JPA 2+ এর জন্য এটি কৌশলটি করে

 <jar-file></jar-file>

টীকাযুক্ত @ এন্টিটি ক্লাসের জন্য যুদ্ধের সমস্ত জার স্ক্যান করুন


2
আপনার এই সম্পর্কে আরও তথ্য আছে? এই কাজটি কি দুর্ঘটনাক্রমে বা স্পেসিফিকেশনে লেখা আছে? এটি বাস্তবায়নের উপর নির্ভরশীল?
মার্কাস

স্ক্যানারটি ক্লাসে অ্যাবস্ট্র্যাক্টস্ক্যানারআইএমপিএল প্রসারিত করছে, হাইবারনেট - এটি কোনও বাগ বা বৈশিষ্ট্য কিনা তা জানা নেই, দুঃখিত
এরিস্কো

1
হাইবারনেট 5.1.2. জাভা এসইতে ফাইনাল, এই সমাধানটি কাজ করে না। হাইবারনেট একটি জার ফাইলের নাম ( java.lang.IllegalArgumentException: Unable to visit JAR file:) আশা করে ।
স্টিফান

1
কাজ করে! :) সাথে ওয়াইল্ডফ্লাই 8.2.1. ফাইনাল + হাইবারনেট 4.3.7. ফাইনাল
আন্দ্রেস

থেক্স ম্যান, অনেক অনুসন্ধান করেছেন এবং এটিই সর্বাধিক সহজ সমাধান উপলব্ধ। ওয়াইল্ডফ্লাই 10 + হাইবারনেট 5.0.7 কাজ করছে।
বুটটা

7

হাইবারনেট <exclude-unlisted-classes>false</exclude-unlisted-classes>এসই এর অধীনে সমর্থন করে না (অন্য পোস্টার এটি টপলিংক এবং এক্লিপস লিঙ্কের সাথে কাজ করে বলে উল্লেখ করেছে)।

এমন সরঞ্জাম রয়েছে যা অধ্যবসায়। এক্সএমএলে ক্লাসগুলির তালিকা স্বয়ংক্রিয়ভাবে উত্পন্ন করবে যেমন ইন্টেলিজজে আমদানি ডাটাবেস স্কিমা উইজার্ড। একবার আপনার প্রকল্পের প্রাথমিক ক্লাসটি যদি আপনি দৃistence়তা.এক্সএমএল এ পেয়ে থাকেন তবে আপনার প্রকল্পের অগ্রগতির সাথে সাথে একক শ্রেণি যুক্ত / সরানো সহজ হওয়া উচিত।


জাভা এসই-তে সত্তাগুলির স্বয় সনাক্তকরণ কেবল জেপিএর অংশ নয়। এর উপর নির্ভরশীল অ্যাপ্লিকেশনগুলি পোর্টেবল নয়।
পাস্কেল থিভেন্ট

4

আমি যা করছি তার মতো আপনি যদি কিছু করছেন তবে নিশ্চিত নই, তবে আমি মাএভেন ব্যবহার করে কোনও বিচ্ছিন্ন অংশে জাএক্সবি ব্যবহার করে কোনও এক্সএসডি থেকে উত্স জাভা তৈরি করছি। আসুন বলুন যে এই নিদর্শনটিকে "বেস-মডেল" বলা হয়

আমি জাভা উত্স সম্বলিত এই নিদর্শনটি আমদানি করতে এবং আমার "বেস-মডেল" আর্টিক্ট জারে সমস্ত শ্রেণীর উপর হাইবারনেট চালাতে চেয়েছিলাম এবং প্রতিটি স্পষ্টভাবে নির্দিষ্ট করে দিতে চাইনি। আমি আমার হাইবারনেট উপাদানটির জন্য নির্ভরতা হিসাবে "বেস-মডেল" যুক্ত করছি তবে সমস্যাটি অধ্যবসায় ট্যাগ x এক্সএমএল আপনাকে কেবল পরম পাথ নির্দিষ্ট করার অনুমতি দেয়।

আমি যেভাবে এটি পেয়েছি তা হ'ল আমার "বেস-মডেল" জারের নির্ভরতাটি আমার টার্গেট ডিয়ারের সাথে স্পষ্টভাবে অনুলিপি করা এবং এর সংস্করণটিও ছাঁটাই করা। সুতরাং আমি যদি আমার "বেস-মডেল" আর্টিক্টটি তৈরি করি তবে এটি "বেস-মডেল -১.০-এসএনএপিএসএইচটি.জার" তৈরি করে, অনুলিপি-সংস্থান পদক্ষেপ এটিকে "বেস-মডেল.জার" হিসাবে অনুলিপি করে।

তাই হাইবারনেট উপাদানটির জন্য আপনার পম এ:

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

এবং পরিশেষে আমার অধ্যবসায়। এক্সএমএল আমি স্পষ্টভাবে এইভাবে জারের অবস্থান নির্ধারণ করতে পারি:

<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>উপাদানগুলি বাদ দিলেও সমস্ত প্রশ্নগুলি কাজ করছে । এটি একটি স্প্রিং / হাইবারনেট / মাভেন অ্যাপ্লিকেশনটিতে। তবে আপনাকে ইঙ্গিত করে বলেছে যে "যখন দৃ pers়তা ব্যবহার করবেন না এক্সএলএল লোকেশন আমি এই << ক্লাস> উপাদানগুলি বাদ দিতে পারি" " তবে এটি আমার পক্ষে অন্যভাবে।
ভাগ্যবান

@ আপনি ঠিক বলেছেন, কারণ দৃistence়তা XMLLocation প্যাকেজগুলি টসস্ক্যানকে ওভাররাইড করে - যদি আপনি উত্সগুলি দেখুন। সুতরাং প্যাকেজস টোস্ক্যান ব্যবহার করার সময় এটি ব্যবহার করবেন না।
আর্টেম নোভিকভ

2

আমি নিশ্চিত না যে এই সমাধানটি অনুমানের অধীনে রয়েছে তবে আমি মনে করি আমি অন্যদের জন্য ভাগ করে নিতে পারি।

নির্ভরতা গাছ

আমার-entities.jar

কেবল সত্তা শ্রেণি রয়েছে। কোন META-INF/persistence.xml

আমার-services.jar

উপর নির্ভর করে my-entities। শুধুমাত্র ইজেবি রয়েছে।

আমার-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 ব্যবহার করছি। দৃ pers়তা.এক্সএমএলে একই যোগ না করে সত্তা লোড করার ক্ষেত্রে, আমি জবস স্ট্যান্ডেলোন এক্সএমএলে নিম্নলিখিত সিস্টেমের সম্পত্তিটি যুক্ত করেছি:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.