ฉันสามารถใช้ Hibernate Session Factory ที่ประกาศใน DispatcherServlet Context แทน hibernate.cfg.xml ได้หรือไม่

ในโครงการ Spring MVC ก่อนหน้าของฉัน ฉันใช้ Hibernate เป็นผู้ให้บริการสำหรับ JPA ฉันไม่จำเป็นต้องสร้างไฟล์ hibernate.cfg.xml เพราะฉันได้ประกาศ Hibernate Session Factory ในไฟล์ Spring DispatcherServlet Context ของฉันและฉันได้ประกาศไฟล์ persistence.xml แล้ว

ในโปรเจ็กต์ใหม่ของฉัน ฉันต้องการใช้ Hibernate โดยพื้นฐาน ฉันได้สร้างคลาสเอนทิตีจากโครงสร้างฐานข้อมูลของฉัน อย่างไรก็ตาม ยังไม่มีการสร้างคลาส IDEA DAO เพราะเหตุใด ฉันสามารถสร้างคลาส DAO ใน IDEA ในทางใดทางหนึ่งได้หรือไม่ และในระหว่างการสร้าง POJO นี้ คลาสเอนทิตีที่ฉันได้สร้าง Hibernate Session Factory ในไฟล์บริบท DispatcherSerlvet ด้วย

ฉันได้สร้างคลาส DAO แบบง่ายของตัวเองเพื่อตรวจสอบคลาสที่มีอยู่ในฐานข้อมูล แต่ข้อผิดพลาดนี้เกิดขึ้น:

Error in creating SessionFactory object./hibernate.cfg.xml not found

ดังนั้นฉันคิดว่าฉันต้องสร้าง hibernate.cfg.xml และถ้าใช่ ฉันต้องเก็บการประกาศ Hibernate Session Factory ไว้ในไฟล์ DispatcherServlet Context ของฉันเลยหรือไม่

แก้ไข

<!-- Hibernate session factory -->
<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <beans:property name="dataSource">
        <beans:ref bean="dataSource" />
    </beans:property>

    <beans:property name="hibernateProperties">
        <beans:props>
            <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop>
            <beans:prop key="hibernate.show_sql">true</beans:prop>
            <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop>
            <beans:prop key="hibernate.connection.url">jdbc:mysql://localhost/finances</beans:prop>
            <beans:prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</beans:prop>
            <beans:prop key="hibernate.connection.username">root</beans:prop>
            <beans:prop key="hibernate.connection.password">root</beans:prop>
        </beans:props>
    </beans:property>

    <beans:property name="annotatedClasses">
        <beans:list>
            <beans:value>my.package.FirstClass</beans:value>
            <beans:value>my.package.SecondClass</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>
<!-- Hibernate session factory end -->

<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>

แก้ไข #2

ฉันได้ย้ายคลาสที่มีคำอธิบายประกอบและคำจำกัดความการเชื่อมต่อไปยังไฟล์ hibernate.cfg.xml แล้ว ฉันได้ลบคำจำกัดความของโรงงานเซสชันและคำจำกัดความ Transaction Manager ออกจากไฟล์กำหนดค่าสปริงแล้ว และวัตถุที่คงอยู่อย่างง่ายของฉันในฐานข้อมูลของฉันก็ทำงานได้อย่างถูกต้อง บางทีนี่อาจเป็นวิธีที่สั้นที่สุดในการทำงานกับ Spring MVC และ Hibernate แต่แล้ว Transaction Managerล่ะ? สิ่งนี้จำเป็นสำหรับการดำเนินการหรือการกระทำอื่นหรือไม่?


person woyaru    schedule 05.09.2012    source แหล่งที่มา


คำตอบ (1)


ฉันไม่จำเป็นต้องสร้างไฟล์ hibernate.cfg.xml เพราะฉันได้ประกาศ Hibernate Session Factory ในไฟล์ Spring DispatcherServlet Context ของฉันและฉันได้ประกาศไฟล์ Peristence.xml แล้ว

AFAIK ในขณะที่ใช้ JPA เราจำเป็นต้องกำหนด entityManagerFactory ในไฟล์การกำหนดค่า Spring และการใช้งาน JPA นั้นถูกกำหนดโดยคุณสมบัติ jpaVendorAdapter persistence.xml ใช้เพื่อกำหนดหน่วยการคงอยู่ hibernate.cfg.xml ไม่จำเป็นสำหรับ JPA

ในโปรเจ็กต์ใหม่ของฉัน ฉันต้องการใช้ Hibernate โดยพื้นฐาน

หากคุณต้องการใช้ไฮเบอร์เนตโดยตรง คุณจะต้องกำหนดโรงงานเซสชันในไฟล์การกำหนดค่าสปริงหรือในไฟล์ hibernate.cfg.xml เช่น

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.
    annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.foo.Bar</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect"> org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>

คุณกำลังผสมผสานการกำหนดค่า JPA และ Hibernate
ลิงก์ต่อไปนี้อาจช่วยให้คุณหลีกเลี่ยงความสับสน
สปริง + ไฮเบอร์เนต
สปริง + JPA (พร้อมการใช้งานไฮเบอร์เนต)


แก้ไข: ใช้ AnnotationSessionFactoryBean ขณะที่คุณกำลังใช้คำอธิบายประกอบเพื่อกำหนดการแมป

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
person Ajinkya    schedule 05.09.2012
comment
ขอบคุณสำหรับคำตอบ. ตามการใช้ Hibernate โดยตรง: ฉันได้กำหนดโรงงานเซสชันในไฟล์กำหนดค่าสปริง แต่ฉันได้รับข้อผิดพลาดที่ไม่พบ hibernate.cfg.xml ดังนั้นฉันจึงไม่สามารถกำหนดโรงงานเซสชันได้ในไฟล์กำหนดค่าสปริงหรือในไฟล์ hibernate.cfg.xml - person woyaru; 05.09.2012
comment
@woyaru: คุณสามารถกำหนด sessionFactory ในไฟล์กำหนดค่าได้ ฉันได้เพิ่มตัวอย่างสำหรับสิ่งเดียวกัน ตรวจสอบว่าคุณได้กำหนด sessionFactory อย่างถูกต้องหรือไม่ อาจมีคุณสมบัติบางอย่างหายไป และนั่นเป็นเหตุผลว่าทำไม Spring จึงมองหา hibernate.cfg.xml - person Ajinkya; 05.09.2012
comment
ฉันได้กำหนดคุณสมบัติเดียวกันกับที่คุณกำหนดไว้ในตัวอย่างในโรงงานเซสชันของฉัน ในตัวอย่างจากลิงก์ มีคุณสมบัติ configLocation เช่นกัน แต่ภายในมีคุณสมบัติ hibernate.cfg.xml ฉันได้เพิ่มคำจำกัดความของโรงงานเซสชั่นในคำถามของฉันแล้ว - person woyaru; 05.09.2012
comment
@woyaru: ฉันคิดว่าคุณควรใช้ AnnotationSessionFactoryBean แทน LocalSessionFactoryBean ฉันได้อัปเดตคำตอบของฉันแล้ว - person Ajinkya; 05.09.2012
comment
เมื่อฉันแทนที่ LocalSessionFactoryBean ด้วย AnnotationSessionFactoryBean ฉันได้รับข้อผิดพลาดเช่นเดียวกับที่นี่: stackoverflow.com/a/8566420/845220 AnnotationSessionFactoryBean เป็นส่วนหนึ่งของ Hibernate 3 ฉันต้องการใช้ Hibernate 4 - person woyaru; 05.09.2012