java - 创建一个可以处理所有类型的 CRUD 操作的类。每次我需要执行 CRUD 时,无需创建 SessionFactory 或 Session 对象

标签 java hibernate enums

我想让java中的一个类有一个可以与Hibernate配置交互并执行某些操作的方法,该方法被标识为ENUM(例如:读取,更新,添加,删除等)

方法参数应为(枚举操作、类 DTO、NamedQuery 命名查询、DTOObject Object_to_persist、param(任何额外参数))。

方法应该很方便,我可以在需要时通过传递实际参数(Operation.read、USERDTO.class、namedquery、USERDTO obj_UserDTO、HashMap hmapData)来调用它。

  /* Enum Defined Operation done to the database.
   */ 
     public enum Operations {READ,UPDATE,ADD,DELETE};

      /*Centralized Method Defination for Basic CRUD Operation */
public T<?> DatabaseCRUDOperations((Operation.READ,USERDTO.class , namedquery , USERDTO obj_UserDTO , HashMap<String, String> hmapid){
     switch(Operation opts){
             case Operation.Read : //Call Read Method
               break;

             case Operation.UPDATE: //call Update Method
               break;
                ......
                ......
              default://call any Error Method or set error
        }
   }

基本上我想定义一个自定义类(项目的一种内部框架),它具有所有基本的 CRUD 操作只能通过这个类完成。无需创建 SessionFactory 或 Session 对象,在我需要的每个地方创建。 请通过一些代码片段提出建议。

最佳答案

Java 泛型来救援!准备好感到惊讶吧。

您的抽象实体(如果您想定义在通用 Controller 类等中使用的方法,则很有用):

public abstract class AbstractEntity<ID extends Serializable> implements Serializable {

    public abstract ID getPrimaryKey();//I simply put this here as an example
}

创建通用 DAO 接口(interface):

public interface IGenericDAO<T extends AbstractEntity<ID>, ID extends Serializable> {
    T findByPrimaryKey(ID id);

    T save(T entity);

    void delete(T entity);

    List<T> saveAll(List<T> entities);
    .
    .
    .
}

然后,定义您的抽象通用 DAO:

public abstract class AbstractHibernateDAO<T extends AbstractEntity<ID>, ID extends Serializable> implements IGenericDAO<T, ID> {
    protected Class<T> persistentClass;

    protected AbstractHibernateDAO(){}
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public AbstractHibernateDAO(Class c) {
        persistentClass = c;
    }

    @Override
    @SuppressWarnings("unchecked")
    public T findByPrimaryKey(ID id){
        return (T) HibernateUtil.getSession().get(persistentClass, id);
    }


    @Override
    public T save(T entity){
        HibernateUtil.getSession().saveOrUpdate(entity);
        return entity;
    }

    @Override
    public List<T> saveAll(List<T> entities){
        for(int i = 0; i < entities.size(); i++){
            HibernateUtil.getSession().saveOrUpdate(entities.get(i));
        }
        return entities;
    }

    @Override
    public void delete(T entity){
        HibernateUtil.getSession().delete(entity);
    }
    .
    .
    .
}

实体的 DAO 接口(interface)(在本例中,我使用 Integer 作为主键):

public interface IMyEntityDAO extends IGenericDAO<MyEntity, Integer> {
}

现在(击鼓),您已准备好铺设一些具体的(类)...

DAO:

public class MyEntityDAO extends AbstractHibernateDAO<MyEntity, Integer> implements IMyEntityDAO {
    public MyEntityDAO() {
        super(MyEntity.class);
    }
}

我的实体:

@Entity
@Table(name = "my_entity_table")
public class MyEntity extends AbstractEntity<Integer>{

    @Id
    @Column(name = "index")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

 public Integer getPrimaryKey (){
       return id;
 }
    .
    .
    .
}

繁荣。 (麦克风掉落)

如果您需要进一步解释,请告诉我!

如果不感谢卡梅伦·麦肯齐和他令人惊叹的book here,我就不能正确地发布此内容。 。这让我看到了一个全新的世界,认识到了泛型的力量。

关于java - 创建一个可以处理所有类型的 CRUD 操作的类。每次我需要执行 CRUD 时,无需创建 SessionFactory 或 Session 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35360783/

相关文章:

java - 在hadoop中查找不同列的最有效方法是什么

java - JPA、HIBERNATE奇怪的错误

enums - 特征可以用于枚举类型吗?

ios - 如何使用 self 和 enum 在 Swift 中设置条件断点的条件?

java - JDBC 是否支持枚举?

java - JDK 6 的 LinkedBlockingQueue 替代品

java - 从浏览器下载文件的 Tomcat 8 问题

java - 注入(inject)不适用于新的运算符(operator)

java - Hibernate:线程 "main"org.hibernate.MappingException 中出现异常:无效配置

java - Hibernate和Mysql对象不刷新时间戳列