gpt4 book ai didi

java - Hibernate 通用 DAO、通用服务和通用 View 层?

转载 作者:行者123 更新时间:2023-11-29 10:18:18 25 4
gpt4 key购买 nike

我一直在尝试在 hibernate 中完全理解和实现一个 GenericDAO 层。我是这个概念的新手,一直在阅读和学习。我发现了很多关于 GenericDAO 层的示例实现的示例,这就是我最终得到的。

public class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {

private static Logger log = Logger.getLogger(GenericDAOImpl.class.getName());


private SessionFactory sessionFactory;


@SuppressWarnings("unchecked")
public T findById(long id, Class<T> objectClass) {
log.info("Entered GenericDAOImpl findById(" + id +")");
T result = (T) getSessionFactory().getCurrentSession().load(objectClass, id);
if(result != null){
Hibernate.initialize(result);
return result;
}else{
return null;
}
}

public boolean create(T newInstance) {
log.info("Entered GenericDAOImpl create()");
if(newInstance == null){
return false;
}
getSessionFactory().getCurrentSession().saveOrUpdate(newInstance);
return true;
}


public boolean updpate(T updateInstance) {
log.info("Entered GenericDAOImpl updpate()");
if(updateInstance == null){
return false;
}
getSessionFactory().getCurrentSession().update(updateInstance);
return true;
}

public boolean delete(T entity) {
log.info("Entered GenericDAOImpl delete()");
if(entity == null){
return false;
}
getSessionFactory().getCurrentSession().delete(entity);
return true;
}

@SuppressWarnings("unchecked")
public List<T> findByExample(T exampleInstance, Class<T> objectClass){
log.info("Entered GenericDAOImpl findByExample()");
Criteria searchCriteria = getSessionFactory().getCurrentSession().createCriteria(objectClass);

searchCriteria.add(Example.create(exampleInstance));

return (List<T>)searchCriteria.list();

}

public SessionFactory getSessionFactory() {
return sessionFactory;
}

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

这似乎在理论上应该可行(可能需要一些调整)

我的问题是我可以使用通用的 serviceview layer 来“通过”分层架构方法吗?我对 hibernate 事务的理解还不够充分,无法知道这样做是否安全,以及它对事务的处理等......

例如对于服务层可能是这样的

public class GenericServiceImpl<T, ID extends Serializable> implements GenericService<T, ID>{

private GenericDAO<T, ID> genericDao;

@Override
public T findById(long id, Class<T> objectClass) {
return this.getGenericDao().findById(id, objectClass);
}

@Override
public boolean create(T newInstance) {
return this.getGenericDao().create(newInstance);
}

@Override
public boolean updpate(T updateInstance) {
return this.getGenericDao().updpate(updateInstance);
}

@Override
public boolean delete(T entity) {
return this.getGenericDao().delete(entity);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public List findByExample(T exampleInstance, Class<T> objectClass) {
return this.getGenericDao().findByExample(exampleInstance, objectClass);
}


public GenericDAO<T, ID> getGenericDao() {
return genericDao;
}

public void setGenericDao(GenericDAO<T, ID> genericDao) {
this.genericDao = genericDao;
}


}

那我可以继续做一个通用的 View 层吗?

请让我知道这种方法是否可以接受,或者如果对这种方法有任何疑虑。

提前感谢您的想法和回复!

最佳答案

我已经为 Hibernate 实现了通用实体、Dao 和服务

基础实体

@MappedSuperclass
public class BaseEntity implements Serializable {

private static final long serialVersionUID = -932093556089251203L;

@Id
@GeneratedValue
private Long id;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

}

通用道

public interface GenericDao<T, ID extends Serializable> {

T save(T entity);
T update(T entity);
void delete(T entity);
T findById(long id);
List<T> findAll();
void flush();
}

GenericJpaDao

@Transactional
public abstract class GenericJpaDao<T, ID extends Serializable> implements GenericDao<T, ID> {

private Class<T> persistentClass;

@PersistenceContext
private EntityManager entityManager;

public GenericJpaDao(Class<T> persistentClass) {
this.persistentClass = persistentClass;
}

protected EntityManager getEntityManager() {
return entityManager;
}

@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}

public Class<T> getPersistentClass() {
return persistentClass;
}

@Transactional(readOnly=true)
public T findById(long id) {
T entity = (T) getEntityManager().find(getPersistentClass(), id);
return entity;
}

@SuppressWarnings("unchecked")
@Transactional(readOnly=true)
public List<T> findAll() {
return getEntityManager()
.createQuery("select x from " + getPersistentClass().getSimpleName() + " x")
.getResultList();
}

public T save(T entity) {
getEntityManager().persist(entity);
return entity;
}

public T update(T entity) {
T mergedEntity = getEntityManager().merge(entity);
return mergedEntity;
}

public void delete(T entity) {
if (BaseEntity.class.isAssignableFrom(persistentClass)) {
getEntityManager().remove(
getEntityManager().getReference(entity.getClass(),
((BaseEntity)entity).getId()));
} else {
entity = getEntityManager().merge(entity);
getEntityManager().remove(entity);
}
}

public void flush() {
getEntityManager().flush();
}

}

通用服务

public class GenericService<T, ID extends Serializable> {
@Autowired
private GenericDao<T, ID> genericDao;

public T find(long id) {
return this.getGenericDao().findById(id);
}

public List<T> all() {
return this.getGenericDao().findAll();
}

@Transactional
public T create(T newInstance) {
return (T) this.getGenericDao().save(newInstance);
}

@Transactional
public T updpate(T updateInstance) {
return (T) this.getGenericDao().update(updateInstance);
}

@Transactional
public void delete(T entity) {
this.getGenericDao().delete(entity);
}

public GenericDao<T, ID> getGenericDao() {
return genericDao;
}

public void setGenericDao(GenericDao<T, ID> genericDao) {
this.genericDao = genericDao;
}


}

使用:

用户

@Entity
@Table(name="USER")
public class User extends BaseEntity {

private static final long serialVersionUID = -6189512849157712745L;

@Column(name="username", nullable = false)
private String username;

@Column(name="name", nullable = false)
private String name;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

UserDAO

public interface UserDAO extends GenericDao<User, Long> {


}

UserDAOImpl

@Repository
public class UserDAOImpl extends GenericJpaDao<User, Long> implements UserDAO {

public UserDAOImpl() {
super(User.class);
}

@PersistenceContext
private EntityManager entityManager;

}

最后是 Magic Service my Service Mysv

@Service
public class Mysv extends GenericService<User, Long> {

}

关于java - Hibernate 通用 DAO、通用服务和通用 View 层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12099213/

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