如果持久类具有包含实体引用的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