java - 我使用的是 JPA API 还是 Hibernate API?

标签 java spring hibernate spring-mvc

我对以下示例有疑问:

package org.andrea.myexample.HibernateOnSpring.dao;

import java.util.List;

import org.andrea.myexample.HibernateOnSpring.entity.Person;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.springframework.transaction.annotation.Transactional;

public class PersonDAOImpl implements PersonDAO {

    // Factory per la creazione delle sessioni di Hibernate:
    private static SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    // CREATE CRUD Operation:
    @Transactional(readOnly = false)
    public Integer addPerson(Person p) {

        System.out.println("Inside addPerson()");

        Session session = sessionFactory.openSession();

        Transaction tx = null;
        Integer personID = null;

        try {
            tx = session.beginTransaction();

            personID = (Integer) session.save(p);
            tx.commit();
        } catch (HibernateException e) {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }

        return personID;

    }

    // READ CRUD Operation (legge un singolo record avente uno specifico id):
    public Person getById(int id) {

        System.out.println("Inside getById()");

        Session session = sessionFactory.openSession();

        Transaction tx = null;          
        Person retrievedPerson = null;  

        try {
            tx = session.beginTransaction();
            retrievedPerson = (Person) session.get(Person.class, id);
            tx.commit();
        }catch (HibernateException e) { 
            if (tx != null)                 
                tx.rollback();          
            e.printStackTrace();
        } finally {                 
            session.close();
        }

        return retrievedPerson;
    }

    // READ CRUD Operation (recupera la lista di tutti i record nella tabella):
    @SuppressWarnings("unchecked")
    public List<Person> getPersonsList() {

        System.out.println("Inside getPersonsList()");

        Session session = sessionFactory.openSession();
        Transaction tx = null;
        List<Person> personList = null;

        try {
            tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Person.class);
            personList = criteria.list();
            System.out.println("personList: " + personList);
            tx.commit();
        }catch (HibernateException e) { 
            if (tx != null)                 
                tx.rollback();          
            e.printStackTrace();
        } finally {
            session.close();
        }
        return personList;
    }

    // DELETE CRUD Operation (elimina un singolo record avente uno specifico id):
    public void delete(int id) {

        System.out.println("Inside delete()");

        Session session = sessionFactory.openSession();
        Transaction tx = null;

        try {
            tx = session.beginTransaction();
            Person personToDelete = getById(id);
            session.delete(personToDelete);
            tx.commit();
        }catch (HibernateException e) { 
            if (tx != null)                 
                tx.rollback();          
            e.printStackTrace();
        } finally {
            session.close();
        }

    }

    @Transactional
    public void update(Person personToUpdate) {

        System.out.println("Inside update()");

        Session session = sessionFactory.openSession();
        Transaction tx = null;

        try {
            System.out.println("Insite update() method try");
            tx = session.beginTransaction();
            session.update(personToUpdate);

            tx.commit();
        }catch (HibernateException e) { 
            if (tx != null)                 
                tx.rollback();          
            e.printStackTrace();
        } finally {
            session.close();
        }   

    }


}

在此示例中,我使用的是 JPA API 还是 Hibernate API...使用的注释属于 JPA 还是属于 Hibernate?

Tnx

安德里亚

最佳答案

导入表明:两者都不是。

org.springframework.transaction.annotation.Transactional

这是一个适用于 Hibernate 或 JPA 的 Spring 注释。 JTA API 独立于您选择的 ORM 解决方案。

其余的导入均引用 Hibernate。

我可以理解您的困惑:JPA 是一个独立于您选择的 ORM 解决方案的 API。 Hibernate 是一种实现。

关于java - 我使用的是 JPA API 还是 Hibernate API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15293355/

相关文章:

java - 将ejb代码更改为EntityManager代码

hibernate - 我如何处理 HQL,多对多?

java - 数据源拒绝建立连接,来自服务器 : "Too many connections" 的消息

java - 让用户选择热键然后保存的最佳方法?

java - JFrame 将登录表单锁定在主表单前面

java - 向 Eclipse 添加字典以进行除英文以外的拼写检查

java - 使用带有 java 配置的工厂方法创建 bean

java - REST Controller 中 RequestParam 的正确方法

java - 当组件被限定为 session 时,无法将 Spring Controller 限定为请求

hibernate - 将 Spring、Hibernate、JPA 和 Tomcat 与多个数据库结合使用的选项