Java 使用Spring、JPA和Hibernate的通用DAO设置
我试图编写一个通用代码,在任何实体上实现一些最常见的操作。我已经使用SpringInitializer使用Gradle、SpringBoot2.1.0Snapshot、JPA和Hibernate生成了产品的基础。我使用MySQL Workbench创建了模式和表,并使用它为我的项目生成实体。因此,谈到实际问题,我尝试创建一个通用DAO,其中一些常见操作(如findbyid、edit、delete、create、update、getall)将被实现,然后将其扩展到其他DAO类,以提高可重用性并加快工作速度。这是我到目前为止的代码: UserController.java:Java 使用Spring、JPA和Hibernate的通用DAO设置,java,spring,hibernate,Java,Spring,Hibernate,我试图编写一个通用代码,在任何实体上实现一些最常见的操作。我已经使用SpringInitializer使用Gradle、SpringBoot2.1.0Snapshot、JPA和Hibernate生成了产品的基础。我使用MySQL Workbench创建了模式和表,并使用它为我的项目生成实体。因此,谈到实际问题,我尝试创建一个通用DAO,其中一些常见操作(如findbyid、edit、delete、create、update、getall)将被实现,然后将其扩展到其他DAO类,以提高可重用性并加快
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping(value = "/getUser", method = RequestMethod.GET)
@ResponseBody
public UserEntity getUser() throws Exception {
userService.getUser();
}
}
public interface UserService {
UsersEntity getUser();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDAO userDAO;
@Transactional
public UsersEntity getUser() {
return userDAO.find(Long.valueOf("123"));
}
}
public interface UserDAO extends GenericRepositoryInterface<UsersEntity> {
}
@Repository
public abstract class UserDAOImpl implements UserDAO {
}
public interface GenericRepositoryInterface<T> {
T save(T emp);
Boolean delete(T emp);
T edit(T emp);
T find(Long empId);
}
@Repository
public class GenericRepositoryImplementation<T> implements GenericRepositoryInterface<T> {
protected EntityManager entityManager;
private T type;
public GenericRepositoryImplementation(T type) {
// TODO Auto-generated constructor stub
this.type = type;
}
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public T save(T emp) {
// TODO Auto-generated method stub
entityManager.persist(emp);
entityManager.flush();
return emp;
}
@Override
public Boolean delete(T emp) {
// TODO Auto-generated method stub
try {
entityManager.remove(emp);
} catch (Exception ex) {
return false;
}
return true;
}
@Override
public T edit(T emp) {
// TODO Auto-generated method stub
try{
return entityManager.merge(emp);
} catch(Exception ex) {
return null;
}
}
@Override
public T find(Long empId) {
// TODO Auto-generated method stub
return (T) entityManager.find(type.getClass(), empId);
}
}
UserService.java:
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping(value = "/getUser", method = RequestMethod.GET)
@ResponseBody
public UserEntity getUser() throws Exception {
userService.getUser();
}
}
public interface UserService {
UsersEntity getUser();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDAO userDAO;
@Transactional
public UsersEntity getUser() {
return userDAO.find(Long.valueOf("123"));
}
}
public interface UserDAO extends GenericRepositoryInterface<UsersEntity> {
}
@Repository
public abstract class UserDAOImpl implements UserDAO {
}
public interface GenericRepositoryInterface<T> {
T save(T emp);
Boolean delete(T emp);
T edit(T emp);
T find(Long empId);
}
@Repository
public class GenericRepositoryImplementation<T> implements GenericRepositoryInterface<T> {
protected EntityManager entityManager;
private T type;
public GenericRepositoryImplementation(T type) {
// TODO Auto-generated constructor stub
this.type = type;
}
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public T save(T emp) {
// TODO Auto-generated method stub
entityManager.persist(emp);
entityManager.flush();
return emp;
}
@Override
public Boolean delete(T emp) {
// TODO Auto-generated method stub
try {
entityManager.remove(emp);
} catch (Exception ex) {
return false;
}
return true;
}
@Override
public T edit(T emp) {
// TODO Auto-generated method stub
try{
return entityManager.merge(emp);
} catch(Exception ex) {
return null;
}
}
@Override
public T find(Long empId) {
// TODO Auto-generated method stub
return (T) entityManager.find(type.getClass(), empId);
}
}
UserServiceImpl.java:
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping(value = "/getUser", method = RequestMethod.GET)
@ResponseBody
public UserEntity getUser() throws Exception {
userService.getUser();
}
}
public interface UserService {
UsersEntity getUser();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDAO userDAO;
@Transactional
public UsersEntity getUser() {
return userDAO.find(Long.valueOf("123"));
}
}
public interface UserDAO extends GenericRepositoryInterface<UsersEntity> {
}
@Repository
public abstract class UserDAOImpl implements UserDAO {
}
public interface GenericRepositoryInterface<T> {
T save(T emp);
Boolean delete(T emp);
T edit(T emp);
T find(Long empId);
}
@Repository
public class GenericRepositoryImplementation<T> implements GenericRepositoryInterface<T> {
protected EntityManager entityManager;
private T type;
public GenericRepositoryImplementation(T type) {
// TODO Auto-generated constructor stub
this.type = type;
}
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public T save(T emp) {
// TODO Auto-generated method stub
entityManager.persist(emp);
entityManager.flush();
return emp;
}
@Override
public Boolean delete(T emp) {
// TODO Auto-generated method stub
try {
entityManager.remove(emp);
} catch (Exception ex) {
return false;
}
return true;
}
@Override
public T edit(T emp) {
// TODO Auto-generated method stub
try{
return entityManager.merge(emp);
} catch(Exception ex) {
return null;
}
}
@Override
public T find(Long empId) {
// TODO Auto-generated method stub
return (T) entityManager.find(type.getClass(), empId);
}
}
UserDAO.java:
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping(value = "/getUser", method = RequestMethod.GET)
@ResponseBody
public UserEntity getUser() throws Exception {
userService.getUser();
}
}
public interface UserService {
UsersEntity getUser();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDAO userDAO;
@Transactional
public UsersEntity getUser() {
return userDAO.find(Long.valueOf("123"));
}
}
public interface UserDAO extends GenericRepositoryInterface<UsersEntity> {
}
@Repository
public abstract class UserDAOImpl implements UserDAO {
}
public interface GenericRepositoryInterface<T> {
T save(T emp);
Boolean delete(T emp);
T edit(T emp);
T find(Long empId);
}
@Repository
public class GenericRepositoryImplementation<T> implements GenericRepositoryInterface<T> {
protected EntityManager entityManager;
private T type;
public GenericRepositoryImplementation(T type) {
// TODO Auto-generated constructor stub
this.type = type;
}
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public T save(T emp) {
// TODO Auto-generated method stub
entityManager.persist(emp);
entityManager.flush();
return emp;
}
@Override
public Boolean delete(T emp) {
// TODO Auto-generated method stub
try {
entityManager.remove(emp);
} catch (Exception ex) {
return false;
}
return true;
}
@Override
public T edit(T emp) {
// TODO Auto-generated method stub
try{
return entityManager.merge(emp);
} catch(Exception ex) {
return null;
}
}
@Override
public T find(Long empId) {
// TODO Auto-generated method stub
return (T) entityManager.find(type.getClass(), empId);
}
}
GenericRepositoryInterface.java:
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping(value = "/getUser", method = RequestMethod.GET)
@ResponseBody
public UserEntity getUser() throws Exception {
userService.getUser();
}
}
public interface UserService {
UsersEntity getUser();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDAO userDAO;
@Transactional
public UsersEntity getUser() {
return userDAO.find(Long.valueOf("123"));
}
}
public interface UserDAO extends GenericRepositoryInterface<UsersEntity> {
}
@Repository
public abstract class UserDAOImpl implements UserDAO {
}
public interface GenericRepositoryInterface<T> {
T save(T emp);
Boolean delete(T emp);
T edit(T emp);
T find(Long empId);
}
@Repository
public class GenericRepositoryImplementation<T> implements GenericRepositoryInterface<T> {
protected EntityManager entityManager;
private T type;
public GenericRepositoryImplementation(T type) {
// TODO Auto-generated constructor stub
this.type = type;
}
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public T save(T emp) {
// TODO Auto-generated method stub
entityManager.persist(emp);
entityManager.flush();
return emp;
}
@Override
public Boolean delete(T emp) {
// TODO Auto-generated method stub
try {
entityManager.remove(emp);
} catch (Exception ex) {
return false;
}
return true;
}
@Override
public T edit(T emp) {
// TODO Auto-generated method stub
try{
return entityManager.merge(emp);
} catch(Exception ex) {
return null;
}
}
@Override
public T find(Long empId) {
// TODO Auto-generated method stub
return (T) entityManager.find(type.getClass(), empId);
}
}
我不知道为什么,但在提到的位置存在一个UserDAO类,它无法识别它。我是否遗漏了任何注释或任何内容?未找到
UserDAO
的实现
您希望扩展通用DAO实现:
@Repository
public class UserDAOImpl extends GenericRepositoryImplementation< UsersEntity> implements UserDAO {
public UserDaoImpl() {
super(UsersEntity.class);
}
}
我认为问题在于你的UserDAOImpl。
在这里,您试图注入一个抽象类的依赖项。为userDao提供具体的类,然后将其注入控制器/服务 谢谢!我完全忽略了一个问题,即我使用的是一个抽象类,扩展没有正确完成。