Hibernate ORM中总是需要DAO层吗?

时间:2013-01-24 04:50:58

标签: hibernate database-design orm dao

我认为我在实现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..
}

CompanyRegistration Class -

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

    @Id
    @Column(name = "RegistrationNumber")
    private String registrationNumber;
    @Column(name = "YearOfRegistration")
    private String yearOfRegistration;
    @ManyToOne
    @JoinColumn(name = "CompanyId", nullable = false)
    private Company company;

    public CompanyRegistration(String registrationNumber, String yearOfRegistration, Company company) {
        this.registrationNumber = registrationNumber;
        this.yearOfRegistration = yearOfRegistration;
        this.company = company;
    }

    public String getRegistrationNumber() {
        return registrationNumber;
    }
    public String getYearOfRegistration() {
        return yearOfRegistration;
    }
    public String getCompanyId() {
        return company.Id;
    }
}

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

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

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

所以,我的问题是这是怎么回事? 另外,除了缓存(这里有一个很大的优点),自动持久化集合(但不是所有者对象)和HQL(因为我还没有使用它而无法评论),Hibernate提供了什么?

3 个答案:

答案 0 :(得分:1)

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

public class CompanyDAOImpl{

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

}

可以通过弹簧配置设置entityManager,也可以将其设置为对象...这取决于您创建它的方式。

答案 1 :(得分:1)

我认为您还没有理解DAO layer又名Data Access Objects图层本身的含义。无论您使用什么ORM工具,总是需要DAO层。每个实体都在DAO层中具有DAO类。正是这个层,每个实体类创建会话对象并在持久性对象上调用hibernate api,即save(),update(),delete()等。是的,你需要了解hibernate中的HQL。我们将它用于hibernate的某些功能,如createQuery()api。并阅读了有关DAO模式的this

答案 2 :(得分:1)

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

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

其他好处包括:

  • LazyLoading:可在以后需要时加载关系集合 而不是一次性的一切。它提高了性能,因为如果 您的收藏很大,在您需要时加载所有内容 消耗大量内存。
  • 并发处理:Hibernate为您提供了功能 处理并发,例如OptimisticLocking。如果你使用 OptimisticLocking,每次将对象保存到数据库时,它 将检查版本列中的冲突并抛出 例如,如果有。

否则你必须实现自己的处理这些场景。

关于EntityManager和Session之间的区别,它们是Hibernate的两个ORM API实现。 EntityManager是JPA的实现。语法和用法之间存在一些差异。您可以选择使用其中任何一种。你最好坚持一个。我看过这两个程序混合的程序。