Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务层绑定到spring应用程序中的DB技术_Java_Hibernate_Spring_Service Layer - Fatal编程技术网

Java 服务层绑定到spring应用程序中的DB技术

Java 服务层绑定到spring应用程序中的DB技术,java,hibernate,spring,service-layer,Java,Hibernate,Spring,Service Layer,我的问题是:您的服务层是否绑定到您使用的技术 例如,如果您使用hibernate,您将一些hql查询或条件查询放入服务层,这些查询或条件查询只是hibernate特性,或者您只调用DAO(DAO有hibernate实现,可能还有jdbc实现等等) 我很难为我的软件构建一个高效的分层体系结构 编辑 这是一个简单的服务…我认为这是一个服务。。。使用(hibernate)不绑定到Tecnology i 这是一个使用Dao实现的服务 @Service public class PersonService

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

例如,如果您使用hibernate,您将一些hql查询或条件查询放入服务层,这些查询或条件查询只是hibernate特性,或者您只调用DAO(DAO有hibernate实现,可能还有jdbc实现等等)

我很难为我的软件构建一个高效的分层体系结构

编辑 这是一个简单的服务…我认为这是一个服务。。。使用(hibernate)不绑定到Tecnology i

这是一个使用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
}
//基本DAO接口
公共接口{
EntityClass get(IDType id);
EntityClass findById(IDType id);
EntityClass保存(EntityClass实体);
EntityClass更新(EntityClass实体);
作废删除(EntityClass实体);
}
//HIBERNATE实现
公共抽象类HibernateDAO实现DAO接口{
@自动连线
私人会话工厂会话工厂;
public void setSessionFactory(SessionFactory SessionFactory){
this.sessionFactory=sessionFactory;
}
public void getSessionFactory(){
返回此.sessionFactory;
}
//使用sessionFactory实现所有DAO接口方法
}
//人到接口
公共接口PersonDAO扩展了dao接口{
Person findByName(字符串名称、字符串姓氏);
getInAgeRange名单(国际年1、国际年2);
}
//个人HIBERNATE DAO实现
公共PersonHDAO扩展HibernateDAO实现PersonDAO{
//使用sessionFactory实现PersonDAO接口的方法
}
@服务
公共类人员服务{
//spring通过其xml配置(在本例中为PersonHDAO)注入正确的DAO
@自动连线
私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人私人;
//spring管理事务
@交易的
getInAgeRange公共列表(国际年1、国际年2){
返回格蒂纳格兰热(第1年、第2年);
}
}
//现在…如何使用它
//让我们假设我有一个按钮,按下它一个表将填充年龄范围内的所有人
私有无效actionPerfom(ActionEvent e){
List List=personService.getInAgeRange(age1Spinner.getValue(),age2Spinner.getValue());
//用列表加载表
}
对不起,这墙文字,也许可以对其他人有用我希望,我走在正确的方向? 我的服务层需要一个接口吗? 所有的都正确分层了吗?我也需要一个控制层

谢谢。

我的建议:

对于更大的项目,请使用专用的、基于接口的DAO层。不要让您的服务层知道任何有关底层持久性技术的信息。仅在DAO层中使用Hibernate/JPA/JDBC/JDO/任何内容

对于较小的项目,可以只使用服务层(特别是考虑到Hibernate
Session
和JPA
EntityManager
都公开了最标准的DAO行为这一事实)

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

更新:这是一个示例DAO接口。您的服务层将只针对该接口编码,而实现将在服务层不需要知道的情况下执行会话/entityManager/jdbc调用

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

// 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;
}

DAO是任何特定于数据库的查询的场所—在您的示例中是JDBC或Hibernate


服务层用于向用户(如表示层或其他层)提供API。没有理由使用数据库细节污染服务层。您的服务层可能具有良好的业务逻辑,但它不应该知道底层DB实现IMO

ok,但我的服务层“知道”我使用的技术?我不能很好地解释我…例如,如果我使用hibernate,我的Hibdao实现有一些“findByCriteria”,但dao接口没有(因为JDBC实现没有标准)所以,在我的服务中,我只能使用我的dao接口,或者我可以使用dao实现?我编辑了我的第一篇文章。第一篇!!!第二篇太糟糕了!!!我添加了一些信息,我的做法是正确的?看起来不错。我倾向于在整个代码库中使用相同的ID类型,所以我只使用例如Long,因此在其中只有一个泛型参数dao,但您的版本更灵活。谢谢,我想是的,但举例来说,在我看到的所有dao示例中,都只使用CRUD操作。假设我必须按姓名、姓氏和出生日期查找一些记录,我必须向我的dao或我的服务层添加一个方法?@blow:@seanizer更好地回答了这个问题。您会的“代码到接口”用于任何CRUD和非CRUD方法,然后通过Spring将DAO接口注入服务。
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;
}