ไม่มีผู้ให้บริการที่มีอยู่สำหรับ EntityManager ชื่อ


148

ฉันมีpersistence.xmlชื่อเดียวกันโดยใช้TopLinkภายใต้META-INFไดเรกทอรี จากนั้นฉันมีรหัสเรียกด้วย:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");

ยังฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

2009-07-21 09: 22: 41,018 [main] ข้อผิดพลาด - ไม่มีผู้ให้บริการความคงทนสำหรับ EntityManager ชื่อ agisdb
javax.persistence.PersistenceException: ไม่มีผู้ให้บริการที่มีอยู่สำหรับ EntityManager ชื่อ agisdb
    ที่ javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:89)
    ที่ javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:60)

นี่คือpersistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="agisdb">
        <class>com.agis.livedb.domain.AddressEntity</class>
        <class>com.agis.livedb.domain.TrafficCameraEntity</class>
        <class>com.agis.livedb.domain.TrafficPhotoEntity</class>
        <class>com.agis.livedb.domain.TrafficReportEntity</class>
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/>
            <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="toplink.jdbc.user" value="root"/>
            <property name="toplink.jdbc.password" value="password"/>
        </properties>
    </persistence-unit>
</persistence>

มันควรจะอยู่ใน classpath ยังฉันได้รับข้อผิดพลาดดังกล่าว

คำตอบ:


85

หลังจากนั้น<persistence-unit name="agisdb">ให้กำหนดชื่อผู้ให้บริการที่มีอยู่:

<provider>org.hibernate.ejb.HibernatePersistence</provider>

5
ฉันกำลังใช้ดาร์บี้และไม่จำเป็นต้องระบุสิ่งนี้ (ฉันทำ แต่หลังจากนั้นก็ลบมันออกเมื่อฉันแก้ไขปัญหาเพื่อให้แน่ใจ) ในที่สุดฉันก็ได้รับข้อผิดพลาดเนื่องจาก persistence.xml ไม่ได้อยู่ในโฟลเดอร์ src / META-INF แม้ว่าจะอยู่ในโฟลเดอร์ในพา ธ Eclipse ต้นทางสำหรับโปรเจ็กต์ ฉันคิดว่ามันยากที่จะอยู่บน src / *
Fuhrmanator

6
นี้ไม่จำเป็นในกรณีของฉัน แต่classpathing hibernate-entitymanager * .jarตามที่ระบุไว้ในคำตอบของUalter Jrด้านล่าง ผมใช้แบบสแตนด์อโลนแอป GWT กับจำศีล-core-4.3.7.jar , จำศีล-entitymanager-4.3.7.Final.jarและจำศีล-JPA-2.1-API-1.0.0.jar
Andreas Dietrich

3
เช่นเดียวกันกับ @AndreasDietrich หลังจากแทนที่สิ่งประดิษฐ์ "hibernate-core-4.3.10" ด้วย "hibernate-entitymanager-4.3.10" ใน pom.xml (ฉันใช้ maven) ข้อผิดพลาดนี้หายไป ที่จริงแล้วhibernate.org/orm/downloadsบอกว่าคุณควรใช้ "hibernate-entitymanager-4.3.10" สำหรับ JPA
ฮง

1
นอกเหนือจากนี้ฉันยังต้องเลื่อนขึ้นจาก hibernate-entitymanager-3.4.0.GA เป็น 3.6.10สุดท้าย ในกรณีที่คุณยังคงมี codebase มรดกใช้ Hibernate 3.
Javi Vazquez

5
ฉันบิตแปลกใจที่คุณไม่ได้ทำงานเป็นปัญหากับคุณ<provider/>ในขณะที่ใช้จำศีล-4 คุณควรเปลี่ยนผู้ให้บริการของคุณเพื่อ<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>ดูstackoverflow.com/questions/23041964/...
Rob

86

ใส่"hibernate-entitymanager.jar"ใน classpath ของแอปพลิเคชัน
สำหรับรุ่นที่ใหม่กว่าคุณควรใช้"hibernate-core.jar"แทนการคัดค้านhibernate-entitymanager

หากคุณใช้งานผ่าน IDE บางตัวเช่นEclipse :Project Properties -> Java Build Path -> Libraries.

มิฉะนั้นจะใส่ไว้ใน/libใบสมัครของคุณ


3
เอาฉันไปสองสามชั่วโมงเพื่อคิดว่านี่เป็นสาเหตุ สำหรับคนอื่นที่ค้นหาขวดเลือดนี้ในกรณีของไฮเบอร์เนต 4.1.3 มันอยู่ในโหมดไฮเบอร์เนต - รีลีส -4.1.3 ฟินาล \ lib \ jpa \ hibernate-entitymanager-4.1.3.Final.jar
Vedran

7
และสำหรับพวกเราที่ใช้ Maven นั่นก็จะเป็นorg.hibernateสิ่งประดิษฐ์กลุ่มhibernate-entitymanager
Simon Forsberg

2
มัน eclipselink.jar สำหรับฉันซึ่งหายไปในเส้นทาง ไม่มีการจำศีล * บางสิ่งอยู่ในเส้นทางเลย
ผู้ใช้ที่ไม่รู้จัก

3
ใช้เวลาเพียงไม่กี่ชั่วโมงในการยืนยัน persistence.xml อยู่บนเส้นทางคลาสและเปรียบเทียบทุกแง่มุมของโครงการที่ใช้งานได้กับโครงการที่ไม่ได้ผล ข้อความแสดงข้อผิดพลาดที่ทำให้เข้าใจผิดมากอาจเกิดขึ้นได้หาก persistence.xml หายไปถ้า PU ที่ใช้ชื่อนั้นหายไปหรือเห็นได้ชัดว่า jar ไฮเบอร์เนตหายไป!
David Mann

สำหรับฉันมันคือorg.eclipse.persistence.jpaการทดสอบขอบเขต
มาเร็ก

67

ตรวจสอบให้แน่ใจว่าpersistence.xmlไฟล์อยู่ในไดเรกทอรี:<webroot>/WEB-INF/classes/META-INF


8
สิ่งนี้ใช้ไม่ได้สำหรับฉันทำให้ไม่พบหน่วยความคงทน: ข้อผิดพลาด 'null' ย้ายกลับไปที่ /src/main/resources/META-INF/persistence.xml
tomasb

1
ฉันเดาว่าสิ่งนี้ใช้ได้กับผู้ที่ใช้toplink (หรือเนื้อหาอื่น ๆ ที่เกี่ยวข้องกับเว็บ) สำหรับคนอื่น ๆ คำตอบที่นี่อาจเหมาะสมกว่า
Simon Forsberg

2
ขอบคุณสำหรับฉันเส้นทางคือเป้าหมาย / คลาส / META-INF
Frizz1977

เหมือนกันด้วยเหตุผลแปลก ๆ บางอย่างมันจำเป็นต้องอยู่ในไดเรกทอรี META-INF ไม่เช่นนั้นจะไม่ทำงาน ...
Thomas

17

ฉันต้องการสิ่งนี้ในไฟล์ pom.xml ของฉัน:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.6.Final</version>
</dependency>

ใช้งานได้กับเวอร์ชั่น 4.3.11
petertc

มันเลิกใช้แล้วดูด้านบน ใช้ไฮเบอร์เนตแกนแทน
foo

16

ประสบปัญหาเดียวกันและหาทางแก้ปัญหาไม่ได้เป็นเวลานาน ในกรณีของฉันมันช่วยแทนที่

<provider>org.hibernate.ejb.HibernatePersistence</provider>

กับ

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

ใช้ทางออกจากที่นี่


2
ได้อัปเกรดจาก Hibernate 4.3.5 เป็น 5.2.12 และการเปลี่ยนชื่อผู้ให้บริการนี้ได้แก้ไขปัญหาให้ฉันแล้ว การตั้งค่านั้นปรากฏขึ้นเพื่ออนุญาตให้ JPA ใช้ไฟล์ core .jar แทนเอนทิตี -jar .jar ที่แสดงว่าเลิกใช้แล้วในที่เก็บส่วนกลาง Maven ขอบคุณมากสำหรับการแบ่งปัน
joshpt

10

มีจุดอื่น: หากคุณประสบปัญหานี้ภายในสภาพแวดล้อม Eclipse RCP คุณอาจต้องเปลี่ยนการสร้างจากโรงงานPersistence.createEntityManagerFactoryเป็นเป็นnew PersistenceProvider().createEntityManagerFactory

ดูECFสำหรับการสนทนาอย่างละเอียดเกี่ยวกับเรื่องนี้


นี่เป็นปัญหาที่แน่นอนที่ฉันมีเมื่อใช้ org.eclipse.persistence.jpa 2.4.0 ฉันใช้เวลา 2 ชั่วโมงในการดึงผมออกมาอย่างสงสัยว่าทำไมมันไม่สามารถหา persisence.xml ของฉันได้ ตัวอย่างทั้งหมดดูเหมือนจะไม่รวมสิ่งนี้ โอ้ ... ขอบคุณมาก ๆ !
มาร์คมิลเลอร์

9

บางทีคุณอาจกำหนดผู้ให้บริการรายหนึ่งเช่น<provider>org.hibernate.ejb.HibernatePersistence</provider>แต่อ้างอิงผู้ให้บริการรายอื่นในขวด ที่เกิดขึ้นกับฉัน: ผู้ให้บริการ persistence.xml ของฉันคือ openjpa แต่ฉันใช้ eclipselink ใน classpath ของฉัน หวังว่าจะช่วยได้!


7

คำแนะนำด่วน:

  • ตรวจสอบว่า persistence.xml อยู่ใน classpath ของคุณหรือไม่
  • ตรวจสอบว่าผู้ให้บริการจำศีลอยู่ใน classpath ของคุณหรือไม่

ด้วยการใช้ JPA ในแอปพลิเคชันแบบสแตนด์อโลน (นอก JavaEE) ผู้ให้บริการการคงอยู่จะต้องระบุที่ไหนสักแห่ง สามารถทำได้สองวิธีที่ฉันรู้:

  • เพิ่มองค์ประกอบของผู้ให้บริการลงในหน่วยการมีอยู่: <provider>org.hibernate.ejb.HibernatePersistence</provider>(ตามที่อธิบายไว้ในคำตอบที่ถูกต้องโดย Chris: https://stackoverflow.com/a/1285436/784594 )
  • หรือผู้ให้บริการสำหรับ javax.persistence.spi.PersistenceProvider อินเตอร์เฟซที่จะต้องระบุเป็นบริการดูที่นี่: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (ซึ่งมักจะเป็น รวมเมื่อคุณรวมการจำศีลหรือการนำ JPA อื่นไปใช้ใน classpath ของคุณ

ในกรณีของฉันฉันพบว่าเนื่องจากการกำหนดค่า maven ผิด hibernate-entitymanager jar ไม่ถูกรวมเป็นการพึ่งพาแม้ว่าจะเป็นการพึ่งพาแบบชั่วคราวของโมดูลอื่น


/ facepalm - ฉันลืมที่จะเพิ่มการพึ่งพา Maven สำหรับผู้ให้บริการจำศีล ขอบคุณ!
jgitter

5

หากคุณกำลังใช้ Eclipse ตรวจสอบให้แน่ใจว่ารูปแบบการแยกไม่ได้ลบไฟล์ของคุณออกpersistence.xmlจากโฟลเดอร์ต้นทางบนบิลด์พา ธ

  1. ไปที่Properties -> Java Build Path ->แท็บซอร์ส
  2. ตรวจสอบรูปแบบการแยกของคุณซึ่งอยู่ที่
    MyProject/src/main/java -> Excluded: <your_pattern>
    โหนดทรี
  3. หรือตั้งค่าเป็นExcluded: (None)โดยเลือกโหนดและคลิกปุ่มแก้ไข ...ทางด้านซ้าย

แก้ไขปัญหาของฉัน รูปแบบที่ยกเว้นถูกตั้งค่าเป็น "**" หลังจากดึง / ดึง ฉันไม่รู้ว่าทำไม ...
โจเซลีน

5

ฉันไปงานเลี้ยงมาหลายปีที่นี่ แต่ฉันก็มีข้อยกเว้นเดียวกันในขณะที่พยายามทำให้ Hibernate 3.5.1 ทำงานร่วมกับ HSQLDB และโปรแกรม JavaFX บนเดสก์ท็อป ฉันได้รับมันเพื่อทำงานด้วยความช่วยเหลือของหัวข้อนี้และการทดลองและข้อผิดพลาดมากมาย ดูเหมือนว่าคุณจะได้รับข้อผิดพลาดนี้จากปัญหาที่หลากหลาย:

No Persistence provider for EntityManager named mick

ฉันพยายามสร้างตัวอย่างบทแนะนำการจำศีล แต่เพราะฉันใช้ Java 10 ฉันไม่สามารถให้พวกเขาสร้างและทำงานได้อย่างง่ายดาย ฉันยอมแพ้กับสิ่งนั้นไม่ต้องการเสียเวลาแก้ไขปัญหา การตั้งค่าไฟล์ module-info.java (จิ๊กซอว์) เป็นอีกหนึ่ง hairball ที่หลายคนยังไม่ได้ค้นพบ

ค่อนข้างสับสนว่าไฟล์เหล่านี้ (ด้านล่าง) เป็นไฟล์สองไฟล์เท่านั้นที่ฉันต้องการในไฟล์ build.gradle เอกสาร Hibernate ยังไม่ชัดเจนว่าคุณต้องใส่ Jars ใด Entity-manager ทำให้เกิดความสับสนและไม่จำเป็นต้องใช้ในเวอร์ชันไฮเบอร์เนตล่าสุดอีกต่อไปและไม่ใช่ javax.persistence-api หมายเหตุฉันใช้ Java 10 ที่นี่ดังนั้นฉันจึงต้องรวม jaxb-api เพื่อรับข้อผิดพลาด xml-bind รวมถึงเพิ่มรายการสำหรับโมดูลการคงอยู่ของจาวาในไฟล์ module-info.java ของฉัน

Build.gradle

// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile('org.hibernate:hibernate-core:5.3.1.Final')

// https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'

Module-info.java

// Used for HsqlDB - add the hibernate-core jar to build.gradle too
requires java.persistence;

ด้วย hibernate 5.3.1 คุณไม่จำเป็นต้องระบุผู้ให้บริการด้านล่างในไฟล์ persistence.xml ของคุณ หากไม่ได้ระบุผู้ให้บริการไฮเบอร์เนตจะถูกเลือกตามค่าเริ่มต้น

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

ไฟล์ persistence.xml ควรอยู่ในไดเรกทอรีที่ถูกต้องดังนั้น:

src/main/resources/META-INF/persistence.xml

การก้าวผ่านซอร์สโค้ดจำศีลในดีบักเกอร์ Intellij ซึ่งตรวจสอบภาษาได้เช่นเดียวกันนอกจากนี้ยังโยนข้อยกเว้นที่แน่นอนเนื่องจากคุณสมบัติการแปลภาษาที่ขาดหายไปในไฟล์ persistence.xml ฉันเพิ่มสิ่งนี้ (เพิ่มที่ถูกต้องสำหรับประเภทฐานข้อมูลของคุณ):

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

ฉันยังคงได้รับข้อยกเว้นเหมือนเดิมหลังจากนี้ดังนั้นการก้าวผ่านตัวดีบักอีกครั้งใน Intellij พบว่าเอนทิตีทดสอบที่ฉันพยายามคงอยู่ (ตัวอย่างพ่อแม่ลูกง่าย) ไม่มีคำอธิบายประกอบสำหรับความสัมพันธ์ OneToMany, ManyToOne ฉันแก้ไขสิ่งนี้และข้อยกเว้นหายไปและองค์กรของฉันยังคงโอเคอยู่

นี่คือ persistence.xml สุดท้ายของฉัน:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
            http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="mick" transaction-type="RESOURCE_LOCAL">
    <description>
        Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
    </description>

    <!-- Provided in latest release of hibernate
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    -->

    <class>com.micks.scenebuilderdemo.database.Parent</class>
    <class>com.micks.scenebuilderdemo.database.Child</class>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>

        <property name="javax.persistence.jdbc.url"
                  value="jdbc:hsqldb:file:./database/database;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>

        <property name="javax.persistence.jdbc.user" value="sa"/>
        <property name="javax.persistence.jdbc.password" value=""/>

        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>

</persistence-unit>

</persistence>

ฉันอาจสูญเสียอัญมณีไปประมาณครึ่งวัน คำแนะนำของฉันคือการเริ่มต้นง่ายมาก - การทดสอบรายการเดียวที่มีหนึ่งหรือสองเขตข้อมูลเนื่องจากดูเหมือนว่าข้อยกเว้นนี้อาจมีสาเหตุได้หลายประการ


ขอบคุณสำหรับรายละเอียดการกำหนดค่าจริง ๆ ช่วยแก้ไขได้
Doogle

4

ตัวแปลงมุม: หากคุณใช้ m2Eclipse จะมีการแยกโดยอัตโนมัติในโฟลเดอร์ทรัพยากรของคุณ จากนั้นเมื่อคุณพยายามเรียกใช้การทดสอบภายใน eclipse การขาด persistence.xml ในภายหลังจะทำให้เกิดข้อผิดพลาดนี้


3

ตรวจสอบให้แน่ใจว่าคุณได้สร้างไฟล์ persistence.xml ภายใต้โฟลเดอร์ 'src' ฉันสร้างภายใต้โฟลเดอร์โครงการและนั่นเป็นปัญหาของฉัน


Eclipse 4.4.0 ไม่ต้องการซ้อนโฟลเดอร์ SRC ดังนั้นฉันวาง META-INF ไว้ที่ระดับบนสุดโดยคิดว่า persistence.xml ที่อยู่ใน classpath น่าจะเพียงพอแล้ว ไม่! ฉันต้องสร้าง src / META-INF ด้วยตนเอง (ในระบบปฏิบัติการ) และย้ายไฟล์ persistence.xml ด้วยมือ อาจเป็นไปได้ที่จะทำเช่นนี้ใน Eclipse แต่ฉันไม่สามารถเข้าใจได้
Fuhrmanator

3

หากคุณใช้ Maven อาจเป็นไปได้ว่าไม่ได้มองสถานที่ที่เหมาะสมสำหรับโฟลเดอร์ META-INF คนอื่น ๆ ได้กล่าวถึงการคัดลอกโฟลเดอร์ แต่อีกวิธีที่ใช้งานได้สำหรับฉันคือบอก Maven ว่าจะค้นหาได้ที่ไหนโดยใช้<resources>แท็ก ดู: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html


2

มันเกิดขึ้นเมื่อตัวจัดการเอนทิตีพยายามที่จะชี้ไปยังหน่วยการคงอยู่จำนวนมาก ทำตามขั้นตอนต่อไปนี้:

  1. เปิดไฟล์ที่เกี่ยวข้องในโปรแกรมแก้ไขของคุณ (หากโครงการของคุณถูกปิดใน IDE ของคุณ)
  2. ลบรหัสที่เกี่ยวข้องกับการมีอยู่และตัวจัดการเอนทิตีทั้งหมด
  3. บันทึกไฟล์
  4. เปิดโครงการใน IDE ของคุณ
  5. ตอนนี้ผูกฐานข้อมูลหรือตารางที่คุณเลือก

2

ผมประสบปัญหาเดียวกัน แต่ในEclipseLink เวอร์ชัน 2.5.0

ฉันแก้ไขปัญหาด้วยการเพิ่มไฟล์ jar อีกไฟล์หนึ่งซึ่งจำเป็นต้องใช้ ( javax.persistence_2.1.0.v201304241213.jar.jar );

Jars ต้องการ:
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
- jdbc.jar (ขึ้นอยู่กับฐานข้อมูลที่ใช้)

ฉันหวังว่านี่จะช่วยได้.


2

ฉันยังมีข้อผิดพลาดนี้ แต่ปัญหาคือ namespace uri ใน persistence.xmlใน

ฉันแทนที่http://xmlns.jcp.org/xml/ns/persistenceไปhttp://java.sun.com/xml/ns/persistenceและรุ่น 2.1-2.0

ตอนนี้มันใช้งานได้แล้ว


นั่นเป็นสิ่งที่เกิดขึ้นกับฉันโดยใช้ Tomcat .. ฉันเพิ่งเพิ่มส่วนหัวเต็มเพื่อชี้แจงสำหรับผู้ใช้ใหม่
childno͡.de

2

คุณต้องเพิ่ม hibernate-entitymanager-x.jar ใน classpath

ใน Hibernate 4.x หากมีขวดอยู่แล้วไม่จำเป็นต้องเพิ่ม org.hibernate.ejb.HibernatePersistence ในไฟล์ persistence.xml


1

ตอบคำถามแล้ว แต่ต้องการโพสต์เคล็ดลับที่ถือฉัน ข้อยกเว้นนี้เกิดขึ้นหลังจากข้อผิดพลาดก่อนหน้านี้ ฉันได้รับสิ่งนี้:

property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.

แม้ว่าฉันจะเปลี่ยน persistence.xml เพื่อรวมชื่อคุณสมบัติใหม่:

<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>

ตามข้อความเกี่ยวกับชื่อคุณสมบัติที่เลิกใช้แล้วฉันได้รับ PersistenceException เดียวกันเหมือนด้านบนและมีข้อยกเว้นสตริงอื่นทั้งหมด เคล็ดลับของฉัน: ตรวจสอบให้แน่ใจว่าได้ตรวจสอบจุดเริ่มต้นของไส้กรอกข้อยกเว้น

ดูเหมือนว่ามีข้อผิดพลาดใน Glassfish v2.1.1 ซึ่ง redeploys หรือ undeploys และ deploys ไม่ได้อัปเดต persistence.xml ซึ่งถูกแคชไว้ที่ใดที่หนึ่ง ฉันต้องรีสตาร์ทเซิร์ฟเวอร์และใช้งานได้


1

ใน OSGi-context คุณจำเป็นต้องแสดงรายการหน่วยการคงอยู่ของคุณใน MANIFEST.MF ของบันเดิลเช่น

JPA-PersistenceUnits: my-persistence-unit

ไม่เช่นนั้น JPA-bundle จะไม่ทราบว่าบันเดิลของคุณมีหน่วยการยังชีพ

ดูhttp://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE


1

คุณต้องการไฟล์ jar ต่อไปนี้ใน classpath:

  1. antlr-2.7.6.jar
  2. คอมมอนส์คอลเลกชัน-3.1.jar
  3. DOM4J-1.6.1.jar
  4. จำศีล-คอมมอน-คำอธิบายประกอบ-4.0.1.Final.jar
  5. จำศีล-core-4.0.1.Final.jar
  6. จำศีล-entitymanager.jar
  7. จำศีล-JPA-2.0-API-1.0.0.Final.jar
  8. javassist-3.9.0.jar
  9. JBoss เข้าสู่ระบบ-3.1.1.GA.jar
  10. JTA-1.1.jar
  11. slf4j-API-1.5.8.jar
  12. xxx-JDBC-driver.jar


1

Hibernate 5.2.5
ไฟล์ Jar ที่ต้องการในคลาสพา ธ นี่คือภายในโฟลเดอร์ที่ต้องการของ Hibernate 5.2.5 Final release สามารถดาวน์โหลดได้จากhttp://hibernate.org/orm/downloads/

  1. antlr-2.7.7
  2. CDI-API-1.1
  3. เพื่อนร่วมชั้น-1.3.0
  4. DOM4J-1.6.1
  5. El-API-2.2
  6. Geronimo-jta_1.1_spec-1.1.1
  7. hibernate-commons-annotation-5.0.1.Final
  8. hibernate-core-5.2.5.Final
  9. hibernate-jpa-2.1-api-1.0.0.Final
  10. jandex-2.0.3.Final
  11. javassist-3.20.0-GA
  12. javax.inject-1
  13. JBoss-interceptor-api_1.1_spec-1.0.0.Beta1
  14. jboss-logging-3.3.0.Final
  15. jsr250-API-1.0

สร้างไฟล์ xml "persistence.xml"ใน

YourProject / src / META-INF / persistence.xml

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="sample">

    <class>org.pramod.data.object.UserDetail</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/>
        <property name="hibernate.connection.username" value="root"/>
        <property name="hibernate.connection.password" value="root"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="false"/>

        <property name="hibernate.cache.use_second_level_cache" value="false"/>

        <property name="hibernate.archive.autodetection" value="true"/>
    </properties>
</persistence-unit>

  1. โปรดจดข้อมูลที่กล่าวถึงในแท็ก <persistance> และเวอร์ชันควรเป็น 2.1
  2. โปรดทราบชื่อ <ติดตาหน่วย> แท็กชื่อที่ถูกกล่าวถึงเป็น"ตัวอย่าง" ชื่อนี้จะต้องใช้เหมือนกันทุกประการในขณะที่โหลด

EntityManagerFactor = Persistance.createEntityManagerFactory ("ตัวอย่าง"); . "ตัวอย่าง" สามารถเปลี่ยนแปลงได้ตามแบบแผนการตั้งชื่อของคุณ

ตอนนี้สร้างคลาส Entity ด้วยชื่อตามตัวอย่าง UserDetail ของฉันในแพ็คเกจorg.pramod.data.object

UserDetail.java

package org.pramod.data.object;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user_detail")
public class UserDetail {
    @Id
    @Column(name="user_id")
    private int id;
    @Column(name="user_name")
    private String userName;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }   
    @Override
    public String toString() {
       return "UserDetail [id=" + id + ", userName=" + userName + "]";
    }
}

ตอนนี้สร้างชั้นเรียนด้วยวิธีการหลัก

HibernateTest.java

package org.pramod.hibernate;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.pramod.data.object.UserDetail;

public class HibernateTest {
    private static EntityManagerFactory entityManagerFactory;

    public static void main(String[] args)  {
        UserDetail user = new UserDetail();
        user.setId(1);
        user.setUserName("Pramod Sharma");

        try {
            entityManagerFactory = Persistence.createEntityManagerFactory("sample");
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            entityManager.getTransaction().begin();
            entityManager.persist( user );
            entityManager.getTransaction().commit();
            System.out.println("successfull");
            entityManager.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

ผลผลิตจะได้

UserDetail [id=1, userName=Pramod Sharma]
Hibernate: drop table if exists user_details
Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id))
Hibernate: insert into user_details (user_name, user_id) values (?, ?)
successfull

1

ในกรณีของฉันก่อนหน้านี้ฉันใช้แนวคิดเพื่อสร้างเอนทิตีด้วยสคีมาฐานข้อมูลและpersistence.xmlจะถูกสร้างขึ้นโดยอัตโนมัติsrc/main/java/META-INFและตามhttps://stackoverflow.com/a/23890419/10701129ฉันจะย้ายไปที่src/main/resources/META-INFยังทำเครื่องหมาย META-INF เป็น ซอร์สรูท มันใช้งานได้สำหรับฉัน

แต่เพียงแค่ทำเครื่องหมายดั้งเดิมของ META-INF (นั่นคือ src / main / java / META-INF) เป็นซอร์สรูทไม่ทำงานซึ่งทำให้ฉันสับสน

และนี่คือโครงสร้าง: ป้อนคำอธิบายรูปภาพที่นี่


0

หากมีชื่อแตกต่างกันPersistence.createEntityManagerFactory("JPAService")ในคลาสที่แตกต่างจากที่คุณได้รับข้อผิดพลาด โดยการเปลี่ยนโครงสร้างเป็นไปได้ที่จะได้รับชื่อที่แตกต่างกันซึ่งในกรณีของฉัน ในชั้นหนึ่งที่สร้างขึ้นโดยอัตโนมัติPersistence.createEntityManagerFactory("JPAService")ในprivate void initComponents()ชั้นPersistence.createEntityManagerFactory("JPAServiceExtended")ContactTable แตกต่างจากในชั้น DBManager


0

ของฉันได้รับการแก้ไขโดยการเพิ่มข้อมูลใน persistence.xml เช่น<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>จากนั้นตรวจสอบให้แน่ใจว่าคุณมีไลบรารีบน classpath เช่นใน Maven เพิ่มการพึ่งพาเช่น

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.5.0</version>
</dependency>

0

ตรวจสอบชื่อหน่วยที่ถูกต้อง

<persistence-unit name="com.myapp.model.jpa"
    transaction-type="RESOURCE_LOCAL">    
public static final String PERSISTENCE_UNIT_NAME = "com.myapp.model.jpa";
Persistence.createEntityManagerFactory(**PERSISTENCE_UNIT_NAME**);

0

ในกรณีของฉันมันเป็นเรื่องของความผิดพลาดในสองคุณสมบัติดังนี้ เมื่อฉันเปลี่ยนพวกเขา 'ไม่มีผู้ให้บริการคงอยู่สำหรับ EntityManager ชื่อ' ถูกลบ

ดังนั้นคุณสามารถลองทดสอบการเชื่อมต่อกับคุณสมบัติของคุณเพื่อตรวจสอบว่าทุกอย่างถูกต้อง

<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>

ข้อผิดพลาดแปลกฉันสับสนโดยสิ้นเชิงเพราะมัน


0

ลองนอกจากนี้ยังคัดลอก persistence.xml <project root>\bin\META-INFด้วยตนเองไปยังโฟลเดอร์ วิธีนี้แก้ไขปัญหาใน Eclipse Neon EclipseLink 2.5.2โดยใช้โครงการปลั๊กอินอย่างง่าย


0

มีปัญหาเดียวกัน แต่ใช้งานได้จริงสำหรับฉัน:

mvn install -e  -Dmaven.repo.local=$WORKSPACE/.repository.

หมายเหตุ: คำสั่ง maven จะติดตั้งการอ้างอิงโครงการทั้งหมดของคุณใหม่ตั้งแต่เริ่มต้น คอนโซลของคุณจะเต็มไปด้วยบันทึก verbose เนื่องจาก maven คำขอเครือข่ายกำลังทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.