【问题标题】:How to create a generic DAO for CRUD methods如何为 CRUD 方法创建通用 DAO
【发布时间】:2017-10-20 19:53:37
【问题描述】:

我正在尝试为基本的 CRUD 方法创建一个通用 DAO,以便我可以重用代码,但我真的不知道如何开始。

我已经为每个班级都有了一个 DAO,而且它们工作得很好。

我阅读了大量教程并下载了项目,但我无法适应(或理解)我的程序。

这是我的课:

public class Cliente {
    private String nombre, direccion, telefono, cuit;
    private int codigo, codigoPostal;
    private double saldo, deuda;

    public Cliente(String nombre, String direccion, int codigoPostal, String telefono, String cuit) {
        this.nombre = nombre;
        this.direccion = direccion;
        this.codigoPostal = codigoPostal;
        this.telefono = telefono;
        this.cuit = cuit;
        this.saldo = 0;
        this.deuda = 0;
    }
    
    public Cliente(){
    }
    
    //all the getters and setters

这是我的GenericDAO 不工作

public class GenericDAO {
    
    @Resource(name = "sessionFactory")
    private SessionFactory sessionFactory;

    public <T> T save(final T o){
      return (T) sessionFactory.getCurrentSession().save(o);
    }


    public void delete(final Object object){
      sessionFactory.getCurrentSession().delete(object);
    }

    /***/
    public <T> T get(final Class<T> type, final long id){
      return (T) sessionFactory.getCurrentSession().get(type, id);
    }

    /***/
    public <T> T merge(final T o)   {
      return (T) sessionFactory.getCurrentSession().merge(o);
    }

    /***/
    public <T> void saveOrUpdate(final T o){
      sessionFactory.getCurrentSession().saveOrUpdate(o);
    }

    public <T> List<T> getAll(final Class<T> type) {
      final Session session = sessionFactory.getCurrentSession();
      final Criteria crit = session.createCriteria(type);
     return crit.list();
    }
    
}

我的Class.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

    <hibernate-mapping>
    <class name="principal.Cliente" table="Cliente">
        <id name="codigo" column="codigo">
            <generator class="identity" />
        </id>
        <property name="nombre" type="string" column="nombre"/>
        <property name="direccion" type="string" column="direccion"/>
        <property name="telefono" type="string" column="telefono"/>
        <property name="cuit" type="string" column="cuit"/>
        <property name="codigoPostal" type="int" column="cp"/>
        <property name="saldo" type="double" column="saldo"/>
        <property name="deuda" type="double"  column="deuda"/> 
    </class>
</hibernate-mapping>

这是我的HibernateUtil

public class HibernateUtil {

    private static SessionFactory sessionFactory = buildSessionFactory();
 
    private static SessionFactory buildSessionFactory()
    {
      try
      {
         if (sessionFactory == null)
         {
            Configuration configuration = new Configuration().configure(HibernateUtil.class.getResource("/hibernate.cfg.xml"));
            StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();
            serviceRegistryBuilder.applySettings(configuration.getProperties());
            ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
         }
         return sessionFactory;
      } catch (Throwable ex)
      {
         System.err.println("Initial SessionFactory creation failed: " + ex);
         throw new ExceptionInInitializerError(ex);
      }
    }
 
    public static SessionFactory getSessionFactory()
    {
      return sessionFactory;
    }
 
    public static void shutdown()
    {
      getSessionFactory().close();
    }

还有我的hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/basededatosprueba</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>
        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>
    
        <mapping resource="mapeos/Cliente.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

如果有人能解释如何使它工作,我将不胜感激。

【问题讨论】:

  • Spring-Hibernate 库提供这个功能很长时间了。你真的想重新发明火药吗?
  • 使用 Spring Boot CrudRepository:spring.io/guides/gs/accessing-data-jpa
  • 不知道 Spring-Hibernate 是一回事。谢谢达菲莫
  • 具体来说,您正在寻找 Spring Data JPA 存储库。 Spring Boot 不是必需的,但它使生活变得更加轻松。

标签: java mysql sql hibernate


【解决方案1】:

duffymo 的解决方案

使用 Spring Boot CrudRepository: spring.io/guides/gs/accessing-data-jpa

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 2011-04-22
    • 2012-04-01
    • 2016-12-19
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多