我认为我在实现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提供了什么?
答案 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。您实际上并不需要调用更新操作。
其他好处包括:
否则你必须实现自己的处理这些场景。
关于EntityManager和Session之间的区别,它们是Hibernate的两个ORM API实现。 EntityManager是JPA的实现。语法和用法之间存在一些差异。您可以选择使用其中任何一种。你最好坚持一个。我看过这两个程序混合的程序。