使用注解Hibernate一对多示例

本文概述

  • 使用注释的一对多映射示例
  • 如何获取列表数据
在本节中, 我们将执行一对多关联以使用注释映射持久类的列表对象。
在这里, 我们使用的是论坛的场景, 其中一个问题有多个答案。
使用注解Hibernate一对多示例

文章图片
在这种情况下, 一个问题可能有很多答案, 每个答案可能都有自己的信息, 这就是为什么我们在持久性类(包含Answer类的引用)中使用列表来表示答案的原因。
使用注释的一对多映射示例 1)创建持久性类
该持久类定义了包括List在内的类的属性。
Question.java
package com.srcmini; import javax.persistence.*; import java.util.List; @Entity @Table(name="q5991") public class Question {@Id @GeneratedValue(strategy=GenerationType.TABLE) private int id; private String qname; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name="qid") @OrderColumn(name="type") private List< Answer> answers; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getQname() { return qname; } public void setQname(String qname) { this.qname = qname; } public List< Answer> getAnswers() { return answers; } public void setAnswers(List< Answer> answers) { this.answers = answers; } }

Answer.java
package com.srcmini; import javax.persistence.*; @Entity @Table(name="ans5991") public class Answer { @Id @GeneratedValue(strategy=GenerationType.TABLE) private int id; private String answername; private String postedBy; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAnswername() { return answername; } public void setAnswername(String answername) { this.answername = answername; } public String getPostedBy() { return postedBy; } public void setPostedBy(String postedBy) { this.postedBy = postedBy; } }

2)在pom.xml文件中添加项目信息和配置。
打开pom.xml文件, 然后单击源。现在, 在< dependencies> … . < / dependencies> 标记之间添加以下依赖关系。
< dependency> < groupId> org.hibernate< /groupId> < artifactId> hibernate-core< /artifactId> < version> 5.3.1.Final< /version> < /dependency> < dependency> < groupId> com.oracle< /groupId> < artifactId> ojdbc14< /artifactId> < version> 10.2.0.4.0< /version> < /dependency>

3)创建配置文件
该文件包含有关数据库和映射文件的信息。
< ?xml version='1.0' encoding='UTF-8'?> < !DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 5.3//EN" "http://hibernate.sourceforge.net/hibernate-configuration-5.3.dtd"> < hibernate-configuration> < session-factory> < property name="hbm2ddl.auto"> update< /property> < property name="dialect"> org.hibernate.dialect.Oracle9Dialect< /property> < property name="connection.url"> jdbc:oracle:thin:@localhost:1521:xe< /property> < property name="connection.username"> system< /property> < property name="connection.password"> jtp< /property> < property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver< /property> < mapping class="com.srcmini.Question"/> < /session-factory> < /hibernate-configuration>

4)创建类来存储数据
在此类中, 我们存储问题类别的数据。
package com.srcmini; import java.util.ArrayList; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; public class StoreData { public static void main(String[] args) { StandardServiceRegistry ssr=new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build(); Metadata meta=new MetadataSources(ssr).getMetadataBuilder().build(); SessionFactory factory=meta.getSessionFactoryBuilder().build(); Session session=factory.openSession(); Transaction t=session.beginTransaction(); Answer ans1=new Answer(); ans1.setAnswername("Java is a programming language"); ans1.setPostedBy("Ravi Malik"); Answer ans2=new Answer(); ans2.setAnswername("Java is a platform"); ans2.setPostedBy("Sudhir Kumar"); Answer ans3=new Answer(); ans3.setAnswername("Servlet is an Interface"); ans3.setPostedBy("Jai Kumar"); Answer ans4=new Answer(); ans4.setAnswername("Servlet is an API"); ans4.setPostedBy("Arun"); ArrayList< Answer> list1=new ArrayList< Answer> (); list1.add(ans1); list1.add(ans2); ArrayList< Answer> list2=new ArrayList< Answer> (); list2.add(ans3); list2.add(ans4); Question question1=new Question(); question1.setQname("What is Java?"); question1.setAnswers(list1); Question question2=new Question(); question2.setQname("What is Servlet?"); question2.setAnswers(list2); session.persist(question1); session.persist(question2); t.commit(); session.close(); System.out.println("success"); } }

注意-以类似的方式使用这些批注, 我们还可以对set, map和bag对象执行一对多关联。 输出量
使用注解Hibernate一对多示例

文章图片
使用注解Hibernate一对多示例

文章图片
如何获取列表数据 【使用注解Hibernate一对多示例】在这里, 我们使用HQL来获取Question类的所有记录, 包括答案。在这种情况下, 它将从两个功能相关的表中获取数据。
package com.srcmini; import java.util.*; import javax.persistence.TypedQuery; import org.hibernate.*; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; public class FetchData { public static void main(String[] args) { StandardServiceRegistry ssr=new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build(); Metadata meta=new MetadataSources(ssr).getMetadataBuilder().build(); SessionFactory factory=meta.getSessionFactoryBuilder().build(); Session session=factory.openSession(); TypedQuery query=session.createQuery("from Question"); List< Question> list=query.getResultList(); Iterator< Question> itr=list.iterator(); while(itr.hasNext()){ Question q=itr.next(); System.out.println("Question Name: "+q.getQname()); //printing answers List< Answer> list2=q.getAnswers(); Iterator< Answer> itr2=list2.iterator(); while(itr2.hasNext()) { Answer a=itr2.next(); System.out.println(a.getAnswername()+":"+a.getPostedBy()); } } session.close(); System.out.println("success"); } }

输出量
使用注解Hibernate一对多示例

文章图片

    推荐阅读