
Hibernate一对多的介绍
简单来说,"一对多 "是对数据库中定义的两个表之间关系的一种称呼。如果表A中的任何条目与表B中的一个以上的条目有关,那么这种关系就被称为 "一对多"。这种关系可以在hibernate平台的帮助下实现。Hibernate可以在JPA注释或xml的帮助下将基于java的前端应用程序与任何数据库联系起来。它预装了许多功能,可以通过在你的项目中添加链接库来调用这些功能。
Hibernate One to Many的语法
Hibernate一对多映射的语法类似于一对一映射,但不同的是,有多个条目与一个列相连,而不是只有一个列与另一个列的映射。
要成功地使用hibernate建立一对多的映射,需要遵循一定的语法,这些语法是
- 应该声明@entity注解。
- 应该声明@table注解,并在java页面中定义表的结构。一些相关的属性也可以在这个注解中声明,例如,目录、唯一约束。
- 所有的数据成员和它们的getters和setters都应该被很好的定义。
- 应该声明带有策略的@Id和@GeneratedValue,以标记表中的任何列作为主键。其他的属性,比如说列的值是否应该是唯一的并且不是空的,也可以在这里定义。
- @OneToMany注解应该和表一起定义,它应该被映射到这个列。
- 所有前五个步骤也应该在其他文件中重复进行,在这里将定义另一个表,但要增加一个注释。@joinColumn以及它要映射到的列名。
- 应该创建驱动的java应用程序,它将在hibernate注释的帮助下插入先前创建的表中的记录。所有的配置、会话维护、提交数据记录相关的关键连接器功能都是通过这个主java文件维护和调用的。
Hibernate中的 "一对多 "关系是如何工作的?
一对多映射注释用于有许多实体需要映射的表。
它看起来像
@OneToMany(mappedBy = "Student", cascade = CascadeType.ALL)
级联规则已经在持久化库中定义好了,在实现这个例子的时候,只需要调用即可。这个表现在应该与另一个有多个条目的表相连接。在这个例子中,我们把另一个表作为 "Marks"。
它看起来像
@ManyToOne
@JoinColumn(name = "S_id")
在后台库下有很多编码逻辑和函数,编译器在这些注释的帮助下调用它们。
Hibernate一对多的例子
下面是一个使用hibernate的 "一对多 "映射的例子。你需要在系统中安装Eclipse、JPA库相关的RAR文件、Maven和数据库来运行Hibernate相关程序。
我们以一个学生和科目分数为例。在数据库中创建了两个表,名为 "student "和 "marks"。这两个表之间的关系是一对多的,因为一个学生可以参加多次考试并获得分数。
学生
| S_id |
| S_name |
| S_phno |
分数
| S_id |
| M_marks |
| M_testid |
**注意:**确保在eclipse中创建一个新的Maven项目,并包含Maven依赖文件以避免任何错误。
文件1:Student.java
代码
package test
import java.util.Set;
import javax.persistence.*;
@Entity
@Table(name = "Student")
public class Student {
@Id
@GeneratedValue
@Column(name = "S_id")
private int id;
@Column(name = "S_name")
private String Name;
@Column(name = "S_phno")
private String Phone;
@OneToMany(mappedBy = "Student", cascade = CascadeType.ALL)
private Set marksDetails;
public Student() { }
public int getId() {
return S_id;
}
public void setId(long S_id) {
this.S_id = S_id;
}
public String getName() {
return Name;
}
public void setName(String Name) {
this.Name = Name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Set getMarksDetails() {
return marksDetails;
}
public void setMarksDetails(Set marksDetails) {
this.marksDetails = marksDetails;
}
}
文件2:Marks.java
代码
package test;
import javax.persistence.*;
@Entity
@Table(name = "Marks")
public class Marks {
@Id
@GeneratedValue
@Column(name = "M_testid")
private int M_testid;
@Column(name = "M_marks")
private String M_marks;
@ManyToOne
@JoinColumn(name = "S_id")
private Student student;
public Marks() { }
public int getTestId() {
return M_testid;
}
public void setTestId(int M_testid) {
this.M_testid = M_testid;
}
public String getMarks() {
return M_marks;
}
public void setMarks(String M_marks) {
this.M_marks = M_marks;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
文件3:Test.java
代码
package test;
import org.hibernate.*;
public class Test {
static Session sO;
static SessionFactory sF;
private static SessionFactory buildSessionFactory() {
Configuration cO = new Configuration();
cO.configure("hibernate.cfg.xml");
ServiceRegistry sRO = new StandardServiceRegistryBuilder().applySettings(cO.getProperties()).build();
sFO = cO.buildSessionFactory(sRO);
return sFO;
}
public static void main(String[] args) {
System.out.println("...Example of hibernate one to many mapping...");
try {
sO = buildSessionFactory().openSession();
sO.beginTransaction();
Student studentObj = new Student("Name1", "0123456789");
sessionObj.save(studentObj);
Marks mObj = new Marks ("20", "90");
mObj.setStudent(studentObj);
sO.save(mObj);
Marks mObj = new Marks ("10", "100");
mObj.setStudent(studentObj);
sO.save(mObj);
sO.getTransaction().commit();
System.out.println("\n...Records successfully registered in the database...");
} catch(Exception sqlException) {
if(null != sO.getTransaction()) {
System.out.println("\n.......error......");
sO.getTransaction().rollback();
}
sqlException.printStackTrace();
} finally {
if(sO != null) {
sO.close();
}
}
}
}
输出

结论
Hibernate是一个维护对象关系的模型,从java上开发的前端应用程序到后端数据库。我们经常在数据库中直接处理的一个重要关系类型是 "一对多"。使用hibernate一对多映射注释在表中创建 "一对多 "关系已经变得很容易。这是一种处理数据库密集型应用程序的干净和无杂乱的方法。它帮助开发者专注于编写独立于任何数据库之下的业务逻辑。它绝对是java世界中在数据库上工作的很酷的工具之一。