gpt4 book ai didi

java - 实体类在 AbstractGenericDao 中如何工作?

转载 作者:行者123 更新时间:2023-12-02 04:42:30 25 4
gpt4 key购买 nike

以下是我的项目办公室之一的代码?

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.lang.reflect.ParameterizedType;

import org.hibernate.Session;
import org.springframework.transaction.annotation.Transactional;

import com.sha.microservicecoursemanagement.model.IModel;

@Transactional
public class AbstractGenericDao<T extends IModel> implements IGenericDao<T> {

@PersistenceContext
protected EntityManager em;

protected Class<T> entityClass =
(Class<T>) ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

@Override
public T find(Long id) {
return em.find(entityClass, id);
}

@Override
public List<T> findAll() {
try {

final List<T> resultList =
(this.em.createQuery("SELECT v FROM " + this.entityClass.getCanonicalName() + " v").getResultList());
return resultList;
}
catch(final RuntimeException e) {
e.printStackTrace();
}
return null;
}

@Override
public void save(T entity) {
em.persist(entity);
}

@Override
public T update(T entity) {
return em.merge(entity);
}

@Override
public void delete(final Long id) {
em.remove(findReference(id));
}

@Override
public T findReference(final Long id) {
return em.getReference(entityClass, id);
}

@Override
public Session getSession() {
return (Session) this.em.getDelegate();
}

}

我有很多疑问,首先看下面的代码:

在上面的代码中:(1) 下面这行是什么意思?

protected Class<T> entityClass =
(Class<T>) ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

上面的代码行实际上我们在做什么?什么是“ParameterizedType”,我们正在做“getGenericSuperClass()”。什么是 getActualTypeAruments。为什么我们要取第 [0] 个元素?

(2) 'em.persist' 的作用是什么?(3) 'em.merge' 的作用是什么?(4) findReferece 方法在做什么?(5) getSession方法在做什么?它返回什么样的 session ?

请帮忙,我是 Java 新手!

最佳答案

Java 保留有关父类(super class)的泛型类型信息,您可以通过 Class.getGenericSuperclass() 获取它.

自从您的 AbstractGenericDao意味着可以继承,this.getClass()将始终返回 AbstractGenericDao 的子类型。意思是this.getClass().getGenericSuperclass()将为您提供完整的通用类型 AbstractGenericDao例如类似 AbstractGenericDao<Book> 。既然你知道AbstractGenericDao是参数化类型(它具有类型参数 T ),您可以将其转换为 ParameterizedType然后得到 T 的实际类型例如Book通过调用 getActualTypeArguments()[0] (因为 T 是第一个也是唯一的参数)。这基本上是获取 DAO 中实体的实际类型的技巧。

现在,正如所写的,这段代码有错误。 AbstractEntityDao不是抽象的,可以直接实例化,这会打破这条线,因为它的通用父类(super class)将是 Object 。此外,如果某个类没有扩展 AbstractEntityDao直接,但通过再一个类,该线可能会再次中断,因为 super 类将不是 AbstractEntityDao .

至于您的其他4个问题-persist将实体保存(持久)到数据库中。 merge在数据库中更新它。这些都是基本的 JPA/Hibernate 概念,您可以在阅读任何教程的 5 分钟内了解这些概念。因此,在提问之前先做好自己的研究,不要在一篇文章中提出 5 个问题。

关于java - 实体类在 AbstractGenericDao 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56507435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com