1

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

公司注册类 -

@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.AllHibernate 负责保存、更新、删除等级联操作,并将它们持久保存到数据库中。因此,CompanyRegistration 集合中的任何更改都将直接反映到其数据库表中。因此,Hibernate 将满足我持久保存 CompanyRegistration 集合的需求。

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

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

所以,我的问题是事情是这样运作的吗?此外,除了缓存(对我来说是一个很大的优势)、自动持久化集合(但不是所有者对象)和 HQL(由于我还没有使用过,因此无法对此发表评论)之外,Hibernate 提供了哪些优势?

4

3 回答 3

1

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

public class CompanyDAOImpl{

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

}

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

于 2013-01-24T05:03:10.727 回答
1

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

于 2013-01-24T09:29:11.763 回答
1

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

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

其他好处包括:

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

否则,您将不得不实现自己的来处理这些场景。

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

于 2013-01-24T09:46:24.207 回答