Hibernate一对多映射列表实例(使用xml文件)

Hibernate一对多映射列表实例(使用xml文件)如果持久化类具有包含实体引用的列表(List)对象,则需要使用一对多关联来映射列表元素。
在这里,我们使用论坛应用场景,在论坛中一个问题有多个

如果持久类具有包含实体引用的List 对象,则必须使用一对多关联来映射列表元素。

我们将使用一个论坛应用场景,其中一个问题有多个答案。

在这种情况下,问题可能有多个答案,并且每个答案可能包含唯一的信息。因此,在持久类中使用列表(包含对Answer 类的引用)来表示一组答案。

让我们看一下包含列表对象(其中包含答案类对象)的持久类。

包com.yiibai;

导入java.util.List。

公开课问题{

私有int ID;

私有字符串qname;

私人列表答案的答案。

//获取器和设置器

}

问题类有自己的信息,例如ID、答案名称和海报。

包com.yiibai;

公开课答案{

私有int ID;

私有字符串答案名称。

私有字符串postBy;

//获取器和设置器

}

}

爪哇

Question 类有一个包含实体引用的列表对象(即Answer 类对象)。在这个例子中,我们需要一个一对多列表来映射这个对象。 让我们看看如何映射它。

列表名称=\’答案\’ 级联=\’全部\’

密钥字符串=\’qid\’/密钥

索引列=\’类型\’/索引

1对多类=\’com.yiibai.Answer\’/

/列表

XML

List中的一对多个映射的完整示例

此示例显示了带有实体引用的映射列表的完整示例。创建项目:listonetomany。其完整的项目结构为:

1)创建持久类

该持久类定义了List 等类的属性。

问题.java

包com.yiibai;

导入java.util.List。

公开课问题{

私有int ID;

私有字符串qname;

私人列表答案的答案。

公共int getId() {

返回ID。

}

公共无效setId(int id){

这个.id=ID;

}

公共字符串getQname() {

返回qname。

}

公共无效setQname(字符串qname){

this.qname=qname;

}

公共ListAnswer getAnswers() {

给出答案。

}

公共无效setAnswers(ListAnswer 答案){

this.answers=答案;

}

}

爪哇

答案.java

包com.yiibai;

公开课答案{

私有int ID;

私有字符串答案名称。

私有字符串postBy;

公共int getId() {

返回ID。

}

公共无效setId(int id){

这个.id=ID;

}

公共字符串getAnswername() {

返回答案名称。

}

public void setAnswername(字符串答案名称) {

this.answername=答案名称;

}

公共字符串getPostedBy() {

返回海报。

}

公共无效setPostedBy(字符串postedBy){

this.postedBy=发布者;

}

公共字符串toString() {

返回答案名称+\’by:\’+postedBy。

}

}

爪哇

2)创建持久化类的映射文件

我们创建了一个定义该列表的question.hbm.xml 文件。

?xml 版本=\’1.0\’ 编码=\’UTF-8\’?

!DOCTYPE Hibernate 映射PUBLIC

\’-//Hibernate/Hibernate 映射DTD 3.0//EN\’

“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”

冬眠映射

类名=\’com.yiibai.Question\’ 表=\’q501\’

身份证名称=\’身份证\’

生成器类=\’增量\’/生成器

/ID

属性名称=\’qname\’/属性

列表名称=\’答案\’ 级联=\’全部\’

密钥字符串=\’qid\’/密钥

索引列=\’类型\’/索引

1对多类=\’com.yiibai.Answer\’/

/列表

/班级

类名=\’com.yiibai.Answer\’ 表=\’ans501\’

身份证名称=\’身份证\’

生成器类=\’增量\’/生成器

/ID

属性名称=\’答案名称\’/属性

属性名称=\’postedBy\’/属性

/班级

/休眠映射

XML

3)创建配置文件

文件:hibernate.hnm.cfg.xml 包含有关数据库和映射文件的信息。

4)创建存储数据的类

该类存储Question类的数据。 MainTest.java文件的代码如下:

包com.yiibai;

导入java.util.ArrayList。

导入org.hibernate.*。

导入org.hibernate.boot.MetadataSources。

导入org.hibernate.boot.registry.StandardServiceRegistry。

导入org.hibernate.boot.registry.StandardServiceRegistryBuilder。

导入org.hibernate.cfg.*。

公共类主测试{

公共静态无效主(字符串[] args){

//然而,在5.1.0版本中,hibernate使用以下新方法来检索:

//1.构造类型安全的准服务注册类。它被声明为final,因为它是当前应用程序的单例对象并且不会改变。

//如果configure(\’cfg/hibernate.cfg.xml\’)方法中没有指定资源路径,则默认在类路径中搜索名为hibernate.cfg.xml的文件。

最终StandardServiceRegistry 注册表=new StandardServiceRegistryBuilder()

.configure(\’hibernate.cfg.xml\’).build();

//2. 根据服务注册类创建元数据资源集,构建元数据,一般会生成特定于您的应用程序的会话工厂。

SessionFactory sessionFactory=new MetadataSources(注册表)

.buildMetadata().buildSessionFactory();

/**** 设置的准备工作就完成了。让我们开始数据库操作*****/

Session session=sessionFactory.openSession(); //从会话工厂获取会话。

//创建交易对象

事务t=session.beginTransaction();

答案ans1=新答案();

ans1.setAnswername(\’Java是一种编程语言\’);

ans1.setPostedBy(\’拉维苏\’);

答案ans2=新答案();

ans2.setAnswername(\’Java是一个平台\’);

ans2.setPostedBy(\’Sudhir Wong\’);

答案ans3=新答案();

ans3.setAnswername(\’Servlet 是接口\’);

ans3.setPostedBy(\’李杰\’);

答案ans4=新答案();

ans4.setAnswername(\’Servlet 是API\’);

ans4.setPostedBy(\’阿伦\’);

ArrayListAnswer 列表1=new ArrayListAnswer();

list1.add(ans1);

列表1.add(ans2);

ArrayListAnswer 列表2=new ArrayListAnswer();

list2.add(ans3);

list2.add(ans4);

问题Question1=new Question();

Question1.setQname(\’什么是Java?\’);

Question1.setAnswers(清单1);

问题Question2=new Question();

Question2.setQname(\’什么是servlet?\’);

Question2.setAnswers(清单2);

session.persist(问题1);

session.persist(问题2);

t.commit();

会话.关闭();

System.out.println(\’成功\’);

}

}

爪哇

当您运行上述代码时,输出将如下所示:

log4j:WARN 未找到记录器(org.jboss.logging) 附加程序。

log4j:WARN 请正确初始化log4j 系统。

log4j:WARN 有关详细信息,请参阅http://logging.apache.org/log4j/1.2/faq.html#noconfig。

Sun Mar 26 08:54:12 CST 2017 WARN: 根据MySQL 5.5.45 及更高版本、5.6.26 及更高版本、5.7.6 及更高版本的要求,如果未设置显式选项,则必须默认建立SSL 连接。为了与不使用SSL 的现有应用程序兼容,必须将verifyServerCertificate 属性设置为“false”或useSSL=true 来指定用于服务器证书验证的信任库。

Hibernate:创建表ans501(ID整数不为空,答案名称varchar(255),postedBy varchar(255),qid整数,类型整数,主键(id))Engine=InnoDB

Hibernate:创建表q501(id整数不为空,qname varchar(255),主键(id))Engine=InnoDB

Hibernate: 更改表ans501 添加约束FKlha0fu9fjhckh66ivbt9wxn2p 外键(qid) 参考q501 (id)

从Hibernate: q501 选择max(id)

从Hibernate: ans501 中选择max(id)

Hibernate: q501 (qname, id) 插入值(?)

Hibernate:插入ans501(answername,postBy,id)的值(?)。

Hibernate:插入ans501(answername,postBy,id)的值(?)。

Hibernate: q501 (qname, id) 插入值(?)

Hibernate:插入ans501(answername,postBy,id)的值(?)。

Hibernate:插入ans501(answername,postBy,id)的值(?)。

Hibernate: 更新ans501 设置qid=? type=? 其中id=?

Hibernate: 更新ans501 设置qid=? type=? 其中id=?

Hibernate: 更新ans501 设置qid=? type=? 其中id=?

Hibernate: 更新ans501 设置qid=? type=? 其中id=?

成功

如何获取列表的数据

这里我们将使用HQL来获取Question类的所有记录以及每个问题的答案。 在本例中,我们从两个功能相关的表中读取数据。您需要直接输出Question 类的对象并重写Answer 类的toString() 方法以返回答案标题和出版物标题。 因此,将输出答案名称和帖子标题,而不是参考文献的ID。

FetchData.java 代码如下-

包com.yiibai;

导入java.util.*。

导入org.hibernate.*。

导入org.hibernate.cfg.*。

公共类获取数据{

公共静态无效主(字符串[] args){

会话session=new Configuration().configure(\’hibernate.cfg.xml\’)

.buildSessionFactory().openSession();

查询query=session.createQuery(\’来自问题\’);

ListQuestion list=query.list();

IteratorQuestion itr=list.iterator();

while(itr.hasNext()){

问题q=itr.next();

System.out.println(\’问题名称:\’+q.getQname());

//打印答案

ListAnswer list2=q.getAnswers();

IteratorAnswer itr2=list2.iterator();

while(itr2.hasNext()){

System.out.println(itr2.next());

}

}

会话.关闭();

System.out.println(\’成功\’);

}

}

爪哇

运行FetchData.java 时,输出如下:

log4j:WARN 未找到记录器(org.jboss.logging) 附加程序。

log4j:WARN 请正确初始化log4j 系统。

log4j:WARN 有关详细信息,请参阅http://logging.apache.org/log4j/1.2/faq.html#noconfig。

Sun Mar 26 08:56:45 CST 2017 WARN: 根据MySQL 5.5.45 及更高版本、5.6.26 及更高版本、5.7.6 及更高版本的要求,如果未设置显式选项,则必须默认建立SSL 连接。为了与不使用SSL 的现有应用程序兼容,必须将verifyServerCertificate 属性设置为“false”或useSSL=true 来指定用于服务器证书验证的信任库。

从Hibernate: q501 Question0_ 中,选择Question0_.id 作为id1_1_,选择Question0_.qname 作为qname2_1_

问题名称: 什么是Java?

Hibernate:来自answer501,answer0_.qid为qid4_0_0_,answer0_.id为id1_0_0_,answer0_.type为type5_0_,answer0_.id为id1_0_1_,answer0_.answername为answerna2_0_1_,answer0_.postedBy为postedBy3_0_1_选择。

Java 是一种编程语言by: Ravi Su

Java 是一个平台by: Sudhir Wong

问题名称: 什么是servlet?

Hibernate:来自answer501,answer0_.qid为qid4_0_0_,answer0_.id为id1_0_0_,answer0_.type为type5_0_,answer0_.id为id1_0_1_,answer0_.answername为answerna2_0_1_,answer0_.postedBy为postedBy3_0_1_选择。

Servlet 是: Jai Li 的接口

Servlet 是: Arun 的API

成功

以上#Hibernate一对多映射列表实例(使用XML文件)的相关内容来源网络仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92734.html

(0)
CSDN的头像CSDN
上一篇 2024年6月28日
下一篇 2024年6月28日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注