在我之前的问题,DAO和服务层(JPA/Hibernate + Spring)之后,我决定在使用JPA/Hibernate,Spring和Wicket的应用程序中仅使用一个DAO作为我的数据层(至少在开始时).提出了使用通用CRUD方法,但我不太确定如何使用JPA实现它.你能给我一个例子或分享一个关于这个的链接吗?
我的问题如下.我需要一个类作为Web系统中数据库连接的单点,因此避免让一个用户有两个打开的连接.我需要尽可能优化它,它应该管理系统中的每个事务.换句话说,只有该类应该能够实例化DAO.为了使它更好,它还应该使用连接池!我该怎么办?
我们正在使用Play!HTTP会话的框架.
tenantId并且ipAddress是多个表中共有的列.
当用户登录时,我们都存储tenantId在HttpContextSession
每当我们需要用户的IP地址时,我们Http.Context.current().request().remoteAddress()用来存储IP地址.
我们编写了大量的查询,现在我们想以通用的方式保存或查询tenantId.
所有查询都通过GenericDao进行
我们可以在GenericDao中使用以下内容来获取租户ID,以便我们可以在所有查询中附加吗?
Http.Context.session().get("tenantId");
Run Code Online (Sandbox Code Playgroud)
保存或检索这些细节的最佳方法是什么?
谢谢.
我知道这经常被问到,但我找不到一个有效的解决方案:
这是我的AbstractDAO:
public interface AbstractDao<T>
{
public T get(Serializable id);
//other CRUD operations
}
Run Code Online (Sandbox Code Playgroud)
这是我的JPA实现:
public abstract class AbstractDaoJpaImpl<T> implements AbstractDao<T> , Serializable
{
protected EntityManager em;
protected Class<T> clazz;
@SuppressWarnings("unchecked")
public AbstractDaoJpaImpl()
{
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.clazz = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
}
public abstract void setEntityManager(EntityManager em);
//implementations skipped
}
Run Code Online (Sandbox Code Playgroud)
这是一个实体的道:
public interface PersonDao extends AbstractDao<Person>
{
//empty
}
Run Code Online (Sandbox Code Playgroud)
这是它的实现:
@Repository
public class PersonDaoImpl extends AbstractDaoJpaImpl<Person> implements PersonDao , OtherInterface
{
@PersistenceContext(unitName="company")
@Override
public void setEntityManager(EntityManager em)
{ …Run Code Online (Sandbox Code Playgroud) 我正在开发一个GWT + Hibernate项目.它由各种模块组成,其中我将命名为两个 - 公司和登录.对于每个模块,我已经创建了一个RPC服务,这样项目就不会有一个像神一样的服务来完成所有事情.
为了与数据库进行交互,我使用了Hibernate API - 具体来说,是POJO中的EntityManager和Annotations.
另外,我创建了一个Generic DAO类来处理基本的CRUD操作.GenericDAO类也将处理EntityManager.每个模块服务类都将扩展此GenericDAO,以便它可以添加自己的查询方法.
以下是GenericDAO类的存根 -
public class GenericDataAccessService<EntityType, PrimaryKeyType extends Serializable> {
// Constructor
@Override
public void save(EntityType newEntity) {
// TODO Auto-generated method stub
}
@Override
public void update(EntityType entity) {
// TODO Auto-generated method stub
}
@Override
public EntityType find(PrimaryKeyType primaryKey) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<EntityType> findByProperty(String property) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<EntityType> findAll() {
// …Run Code Online (Sandbox Code Playgroud) 我正在Spring MVC中编写Web.我使用Generic DAO编写了所有DAO.现在我想重写我的服务类.我怎么写"通用服务"?
有我的DAO:
/* ################################# DAO ################################ */
package net.example.com.dao;
import java.util.List;
public interface GenericDao<T> {
public T findById(int id);
public List<T> findAll();
public void update(T entity);
public void save(T entity);
public void delete(T entity);
}
/* ------------------------------------------------------ */
package net.example.com.dao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@Scope("prototype")
public abstract class GenericHibernateDaoImpl<T extends Serializable> implements GenericDao<T> {
private Class<T> clazz;
@Autowired
private SessionFactory sessionFactory;
public final void setClazz(Class<T> clazzToSet) {
this.clazz = clazzToSet; …Run Code Online (Sandbox Code Playgroud) 我正在尝试在java中开发通用DAO.我尝试了以下内容.这是实现通用DAO的好方法吗?我不想使用hibernate.我试图使它尽可能通用,这样我就不必一遍又一遍地重复相同的代码.
public abstract class AbstractDAO<T> {
protected ResultSet findbyId(String tablename, Integer id){
ResultSet rs= null;
try {
// the following lines are not working
pStmt = cn.prepareStatement("SELECT * FROM "+ tablename+ "WHERE id = ?");
pStmt.setInt(1, id);
rs = pStmt.executeQuery();
} catch (SQLException ex) {
System.out.println("ERROR in findbyid " +ex.getMessage() +ex.getCause());
ex.printStackTrace();
}finally{
return rs;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在有:
public class UserDAO extends AbstractDAO<User>{
public List<User> findbyid(int id){
Resultset rs =findbyid("USERS",id) // "USERS" is table name in DB
List<Users> users …Run Code Online (Sandbox Code Playgroud) 我刚刚来自我的小型JavaSE/Guice世界,目前正在发现"由容器携带"-EE6的路径.在使用Glassfish3.1遇到麻烦之后,我刚刚切换到JBoss,现在面临的问题不应该是一个问题.
作为基础结构辅助类,我试图为任何类型的实体创建通用存储库/ DAO.以一种非常简单的方式,这可能看起来像这样.
public class Repository<E, K extends Serializable & Comparable<K>> {
private final Instance<EntityManager> entityManagerInstance;
protected final Class<E> getDomainObjectClass() {
return domainObjectClass;
}
private final Class<E> domainObjectClass;
protected final EntityManager getEntityManager() {
return entityManagerInstance.get();
}
@Inject
public Repository(Instance<EntityManager> entityManageryProvider, Provider<E> domainObjectProvider) {
//This is a dirty hack, sadly :(
domainObjectClass = (Class<E>)domainObjectProvider.get().getClass();
this.entityManagerInstance = entityManageryProvider;
}
public final void persist(E domainObject) {
final EntityManager em = getEntityManager();
em.persist(domainObject);
}
public final Collection<E> getAllEntities() {
final EntityManager em = getEntityManager(); …Run Code Online (Sandbox Code Playgroud) 让我们考虑一个简单的用户插入操作。我用来完成这项工作的 Spring 相关类是UserController, UserService, UserServiceImpl, UserDAO, UserDAOImpl。
在控制器端我调用userService.insert(new User())并在userService.insert()方法中调用userDAO.insert(user)。我认为这种模式存在方法重复。
有没有办法避免方法重复?可能是我的编码有问题。我等你的回复,经验...
预先感谢...
我已经为我的spring/hibernate项目配置了一个自定义通用服务DAO - 这个想法是我可以从我的控制器中轻松地重用它.
它基本上是这样的:
public class DefaultService<T> {
private Class<T> e;
public String className(Class<T> e) {
String clip = e.getName();
clip = clip.substring(clip.lastIndexOf('.') + 1, clip.length());
return clip;
}
public List<T> getAll(Integer status) {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("FROM " + className(e) + " WHERE status = " + status);
return query.list();
}
...
Run Code Online (Sandbox Code Playgroud)
哪个被引用:
@Autowired
public DefaultService<Address> addressService;
addressService.get(1);
Run Code Online (Sandbox Code Playgroud)
但是该String clip = e.getName()行会抛出Null指针异常.如果我将类移动到属性部分,addressService.get(Address.class, 1)我可以使用它(所以但我觉得这有些不整齐,特别是当有多个不同的类被调用时.
有没有办法让类正确生成一个值而不必重复添加到我的所有函数中?
提前致谢.