gpt4 book ai didi

java - 服务层在 spring 应用程序中绑定(bind)到 DB 技术

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

我的问题是:您的服务层是否绑定(bind)到您使用的技术?

例如,如果你使用 hibernate,你将一些 hql 查询或条件查询放入你的服务层,它们只是 hibernate 的特性,或者你简单地调用 DAO(并且 dao 有 hibernate 实现,也许还有 jdbc 实现等。) ?

我在为我的软件构建高效的分层架构时遇到了一些困难。

编辑这是一个简单的服务……我认为这是一个服务……不受我使用的技术的束缚( hibernate )

@Repository
public class PersonHibernateDAO implements PersonDAO {

@Autowired
SessionFactory sessionFactory;

... dao crud operations(implementation of PersonDAO interface) using sessionfactory ...

//and some hibernate features methods
public Person findByCriteria(Criterion criterion){
// code
}
}

@Service
public class PersonService {

@Autowired
private PersonDAO personDao;

@Autowired
private AccessDAO accessDao;

@Transactional
public boolean hasPermission(String username, String accessCode){
Person p=personDao.findByUsername(username);
Access a=accessDao.findByCode(accessCode);
... etc ...
}
}

这是一个使用 Dao 实现的服务

@Service
public class PersonService {

@Autowired
private PersonDAO personDao;

@Autowired
private AccessDAO accessDao;

@Transactional
public boolean hasPermission(String username, String password){
Person p=((PersonHibernateDao)personDao).findByCriteria(Restrictions.eq("username", username);
... etc ...
}
}

这两种方法哪个是正确的?


EDIT2

所以,总结一下我的理解:

// BASE DAO INTERFACE
public interface DAOInterface<EntityClass, IDType extends Serializable> {
EntityClass get(IDType id);
EntityClass findById(IDType id);
EntityClass save(EntityClass entity);
EntityClass update(EntityClass entity);
void delete(EntityClass entity);
}

// AN HIBERNATE IMPLEMENTATION
public abstract class HibernateDAO<EntityClass, IDType extends Serializable> implements DAOInterface<EntityClass, IDType> {

@Autowired
private SessionFactory sessionFactory;

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

public void getSessionFactory(){
return this.sessionFactory;
}

// Implements all DAOInterface method using sessionFactory

}

// PERSON DAO INTERFACE
public interface PersonDAO extends DAOInterface<Person, Long>{

Person findByName(String name, String surname);
List<Person> getInAgeRange(int year1, int year2);
}

// PERSON HIBERNATE DAO IMPLEMENTATION
public PersonHDAO extends HibernateDAO<Person, Long> implements PersonDAO{

// Implements the methods of PersonDAO interface using sessionFactory
}

@Service
public class PersonService {

//spring inject the correct DAO by its xml config(in this case PersonHDAO
@Autowired
private PersonDAO personDAO;

// spring manage the transaction
@Transactional
public List<Person> getInAgeRange(int year1, int year2){
return personDAO.getInAgeRange(year1, year2);
}

}

// NOW... HOW USE IT
//let's assume i have a button, pressing it a table will be populated with all persons in age range
private void actionPerfom(ActionEvent e){
List<Person> list=personService.getInAgeRange(age1Spinner.getValue(), age2Spinner.getValue());
//Load a table with list
}

抱歉,这面文字墙可能对我希望的其他人有用,我正朝着正确的方向前进?我的服务层需要接口(interface)吗?是否全部正确分层?我也需要一个控制层吗?

谢谢。

最佳答案

我的建议:

对于较大的项目,使用专用的、基于接口(interface)的 DAO 层。不要让你的服务层知道底层持久化技术的任何信息。仅在 DAO 层使用 Hibernate/JPA/JDBC/JDO/任何东西。

对于较小的项目,只有一个服务层可能没问题(特别是考虑到 Hibernate Session 和 JPA EntityManager 暴露了大多数标准 DAO 行为的事实盒子。

基本经验法则:如果您要进行技术更改,请确保您只需要更改应用程序的一层

更新:这是一个示例 DAO 接口(interface)。您的服务层将仅针对此接口(interface)进行编码,并且实现将在服务层不需要知道的情况下进行 session /实体管理器/jdbc 调用。

public interface CustomerDao extends CommonDao<Customer>{
Customer getCustomerByEmail(String emailAddress);
List<Customer> getCustomersWithinAgeRange(int lowerBound, int upperBound);
}

关键:在你的服务层,指定你的依赖接口(interface),即

private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao){
this.customerDao = customerDao;
}

代替

// this is horrible, it ties the service layer to implementation
// details of the dao layer
private HibernateCustomerDaoImpl customerDao;
public void setCustomerDao(HibernateCustomerDaoImpl customerDao){
this.customerDao = customerDao;
}

关于java - 服务层在 spring 应用程序中绑定(bind)到 DB 技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4152928/

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