【问题标题】:Spring and Hibernate configurationSpring 和 Hibernate 配置
【发布时间】:2011-11-19 22:02:16
【问题描述】:

由于我是 Java EE 领域的新手,所以我想知道的东西太多了,而且随着我在 Internet 上阅读越来越多的信息,我感到困惑比任何事情都更清楚。我的假设是否正确:

  1. 首先我们需要Entity类(POJO)和@Entity@Table@Column等注解。
  2. 其次,我们创建Service 类,它将使用SessionFactory 对单个数据库的表进行物理更改,这将是@Autowired。如果我是正确的,这就是所谓的 DAO 吗?这个类是否需要实现任何其他类?因为我看到了很多例子,控制器和实体之间的连接就像 3 个类一样长(其中一个是接口)。这些类中有一些实现。
  3. 我们需要的最后一件事是控制器,该控制器将具有Service 类对象,该类对象也将是@Autowired

总结一下:我们有@Controller 类,它使用@Autowired 服务类对象。服务类对象由通过@AutowiredSessionFactory对象执行的save/delete/select方法组成?

如果我是对的,那么所有这些方案都需要哪些配置才能正常工作?如果我错了,请解释如何在 XML 文件中尽可能少地进行配置。

谢谢。

【问题讨论】:

    标签: java hibernate spring jakarta-ee


    【解决方案1】:

    这里隐藏了几个问题,所以我会尝试给你高水平的答案。

    @Entity 这将定义您的对象,更重要的是(使用您提到的其他注释)它将允许 Hibernate/JPA 成功地将数据映射并持久化到选择的 RDBMS。

    完成这项工作所需的其他信息(当然包括适当的库除外)是休眠配置文件 (hibernate.cfg.xml),它将用于确定数据库连接信息、其他休眠设置和类被扫描(假设注释正在使用中)。

    @服务 是一个 spring 原型,表明 Spring 应该管理这个类并且它应该被视为一个服务(我认为这是一个几乎标记接口,我相信它的处理方式几乎与 @Component 相同)。至于实现任何接口或扩展特定类,我不这么认为。我相信最大的问题是抓住实体经理。让我从一个爱好项目中提取一个简短的 sn-p...

    @Service
    public class UserServiceImpl implements UserService {
    
    
    private SessionFactory sessionFactory;
    
    public UserServiceImpl() {
        sessionFactory = new Configuration().configure().buildSessionFactory();
    
    }
    
    
    @Override
    public Collection<Person> getAllUsers() {
        Collection<Person> peoples = new ArrayList<Person>();
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        Query query = session.createQuery("from Person").setMaxResults(500);
        peoples.addAll(query.list());
        session.close();
        return peoples;
    }
    }
    

    @Autowired Autowired 是 Spring 使用的一个注解,用于指示注解的字段将由 spring 注入(按类型可能是最常见的,但肯定不是唯一的方式)(只要该类由 spring 管理或标记为 @Configurable)。

    反总结: 您需要的唯一 XML 是休眠配置文件。您不需要(甚至必须自动装配会话工厂,只要您有权访问它。

    【讨论】:

    • 感谢您的回复,我终于有时间看它了。我有几个问题。为什么在您的示例中您需要实现其他类?我认为只有当你有几个类似的类可以在实现类中总结时才需要实现。例如比萨、意大利面、汤(这些类实现食物)是食物(接口)。还有一个问题:三个类使用hibernate够吗,一个是@Entity,一个是@Service,最后一个是@Controller
    • 抱歉耽搁了。我实现该接口(在此示例中)的唯一原因是我从另一个示例中剪切和粘贴。 cmets 中不适合对接口进行彻底的讨论,但在 stackoverflow.com/questions/2659366/… 上有很好的讨论。至于类的数量......我认为技术上,如果你有@Entity 和适当的配置文件,你可以编写一个单元测试来进行查询。
    【解决方案2】:

    你在正确的轨道上。这是 Spring 和 Hibernate 的一个很好的 walkthrough

    您可以使用@Service 而不是@Autowired 来注释您的服务,但两者都可以。您需要在 application-context.xml 中添加一个部分来告诉 Spring 在哪些包中查找注释。

    Service 是 DAO,这是正确的,这是常见的用法,但如果您愿意,您可以编写一个不仅仅是为一个实体提供 CRUD 和其他 getter 的 Service。一个实体代表一个数据库表,一个控制器处理一个(或多个)URL,服务是介于这两者之间的类,通过提供 CRUD 和由多个控制器调用的其他方法,可以更轻松地从数据库获取和设置数据。

    如果您浏览了链接中的示例,那么它将让您很好地了解 Spring 的不同部分是如何工作的。

    【讨论】:

    • 嗨,很好的例子。是否可以将 hibernate-context.xml 和 hibernate.cfg.xml 连接到一个文件中(如果可以将 hibernate.cfg.xml 文件中的配置添加到 hibernate-context.xml 和 hibernate.cfg.xml 将被删除,那就太好了)。
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2015-10-08
    • 2011-05-15
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多