Hibernate ORM中始终需要DAO层?

Hibernate ORM中始终需要DAO层?,hibernate,database-design,orm,dao,Hibernate,Database Design,Orm,Dao,我想我在实现Hibernate ORM时完全弄糊涂了 我的理解是Hibernate允许您消除DAO层。这并不是说它是强制性的(甚至是有利的),但它确实允许您这样做 但是,就我而言,我看不出这是怎么发生的。 我将使用我系统中的两个实体——公司和公司注册来解释我的案例 公司级- @Entity @Table(name = "Company") public class Company extends LightEntity implements BaseSerializable { @Id

我想我在实现Hibernate ORM时完全弄糊涂了

我的理解是Hibernate允许您消除DAO层。这并不是说它是强制性的(甚至是有利的),但它确实允许您这样做

但是,就我而言,我看不出这是怎么发生的。 我将使用我系统中的两个实体——公司和公司注册来解释我的案例

公司级-

@Entity
@Table(name = "Company")
public class Company extends LightEntity implements BaseSerializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id")
    private int id;

    @Column(name = "Code")
    private String code;

    @Column(name = "Name")
    private String name;

    @Column(name = "Address")
    private String address;

    @Column(name = "ContactNumber1")
    private String contactNumber1;

    @Column(name = "ContactNumber2")
    private String contactNumber2;

    @Column(name = "EMail")
    private String email;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company", cascade = CascadeType.ALL)
    private List<CompanyRegistration> companyRegistrations;

    public Company(String code, String name) {
        this.code = code;
        this.name = name;
    }

    // getters and setters follow..
}
在Company类中,我指定了
CascadeType.All
,以便Hibernate负责保存、更新、删除等级联操作,并将它们持久化到数据库中。因此,CompanyRegistration集合中的任何更改都将直接反映到其数据库表中。因此,Hibernate将满足我持久保存CompanyRegistration集合的需要

但是,为了持久化公司对象,我仍然必须使用DAO层,不是吗?我知道我可以在该层中使用HQL而不是标准SQL,但这不是我关心的问题。还有一个单独的层

我很可能误解了这里的概念

所以,我的问题是,事情是如何运作的?
另外,Hibernate除了缓存(这对我来说是一个很大的优势)、自动持久化集合(但不是所有者对象)和HQL(由于我还没有使用它,所以无法对此进行评论)之外,还提供了什么优势?

您的DAO实现将仅用于从EntityManager调用方法,您不需要创建SQL或HQL来插入,您可以通过调用EntityManager的persist方法轻松地完成这项工作

public class CompanyDAOImpl{

    public void save(Company company){ 
        entityManager.persist(company) 
    }

}

entityManager可以通过spring配置设置,也可以将其设置为对象。。。这取决于您如何创建它。

我想您还没有理解
DAO层
aka
数据访问对象
层本身的含义。无论您使用什么ORM工具,您总是需要一个DAO层。每个实体在DAO层中都有其DAO类。正是在这一层中,每个实体类创建会话对象并在持久对象上调用hibernate api,即save()、update()、delete()等。是的,你需要在hibernate中学习。我们在hibernate的某些函数中使用它,比如createQuery()api。阅读DAO模式。

Hibernate背后的最大优势是对象关系映射。它会自动为您在关系数据和对象之间进行映射。如果没有Hibernate,您将不得不编写自己的代码来手动创建域对象,或者从每次检索的数据集中创建对象列表

例如,当您使用Hibernate,
session.get(objectId)
检索对象时,它返回一个所谓的托管对象。提交事务后,Hibernate将对此对象执行脏检查(检查修改),并在必要时刷新对db的更改。实际上,您不需要调用更新操作

其他好处包括:

  • LazyLoading:可以在以后需要时加载关系集合 而不是一下子把所有的事情都做完。它提高了性能,因为如果 你的收藏量很大,当你需要的时候就可以装载所有的东西 消耗大量内存
  • 并发处理:Hibernate为您提供了 处理并发性,例如OptimisticLocking。如果您使用 OptimisticLocking,每次将对象保存到数据库时 将检查版本列中是否存在冲突并引发 如有例外
否则,您必须实现自己的来处理这些场景


关于EntityManager和Session之间的区别,它们是由Hibernate实现的两个ORMAPI。EntityManager是的实现。语法和用法之间有一些区别。您可以选择使用其中一种。你最好坚持一个。我看过一个将这两者混合在一起的节目

entityManager.remove(对象);entityManager.find(类,id);还有其他可以调用的方法。您可以查看javadoc以更好地理解OK。这意味着我只能在特定数据检索的情况下使用HQL,EntityManager可能无法执行,对吗?另外,会话在Hibernate会话管理中不是比EntityManager更好吗?是的,但您也可以使用HQL插入、删除等。。。我从来不需要用的是的。我明白了。但我认为最好尽可能利用EntityManager/会话。我同意。ORM不是DAO的替代/覆盖模式。它们应该一起使用。对吗?对,伙计,你总是可以实现你选择或需求的设计模式,但最后你有一个DAO层,可以用你的ORM工具访问数据库。顺便问一下,你关心的是添加一个额外的DAO层吗?有另一种方法可以将数据访问代码放在模型层中,而不是放在单独的层中。您可以看到由
springroo
生成的代码的实现,我关心的不是添加DAO层,而是数据访问代码;它是否存在于模型中或单独的层中。但是,现在我明白了ORM并不是DAO模式的替代品。那是我的误解。
public class CompanyDAOImpl{

    public void save(Company company){ 
        entityManager.persist(company) 
    }

}