zoukankan      html  css  js  c++  java
  • 通过Bag一对多映射示例(使用xml文件)

    如果持久化类具有包含实体引用的列表对象,则需要使用一对多关联来映射列表元素。 我们可以通过列表(list)或包(bag)来映射这个列表对象。

    请注意,bag不是基于索引的,而list是基于索引的。

    在这里,我们使用论坛的场景:论坛中一个问题有多个答案。

    下面来看看看具有列表对象的持久化类。 在这种情况下,一个问题可以有多个答案,每个答案可能有自己的信息,这就是为什么这里要使用列表(list)元素(包含答案对象)代表一个答案集合。
    Question类代码如下 -

    package com.yiibai;
    
    import java.util.List;
    
    public class Question {
        private int id;
        private String qname;
        private List<String> 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<String> getAnswers() {
            return answers;
        }
    
        public void setAnswers(List<String> answers) {
            this.answers = answers;
        }
    
    }
    
    Java

    Question类有自己的信息,如idanswernamepostedBy等。

    package com.yiibai;
    
    public class Answer {
        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;
        }
    
    }
    
    Java

    Question类具有包含实体引用的列表对象(即Answer类对象)。 在这种情况下,我们需要使用一对多的bag标签来映射此对象。 下面来看看看我们如何映射它。

    <bag name="answers" cascade="all">  
        <key column="qid"></key>  
        <one-to-many class="com.yiibai.Answer"/>  
    </bag>
    
    XML

    通过一对多关联在集合映射中映射包的示例

    在这个例子中,我们将看到包含实体引用的映射列表的完整示例。创建一个Java项目:bagonetomany,其完整的目录结构如下 -

    1)创建持久化类

    这个持久化类定义了类的属性,包括List

    Question.java 代码如下所示 -

    package com.yiibai;
    
    import java.util.List;
    
    public class Question {
        private int id;
        private String qname;
        private List<String> 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<String> getAnswers() {
            return answers;
        }
    
        public void setAnswers(List<String> answers) {
            this.answers = answers;
        }
    
    }
    
    Java

    Answer.java 代码如下所示 -

    package com.yiibai;
    
    public class Answer {
        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;
        }
    
        public String toString(){
            return this.answername+", PostedBy "+this.postedBy;
        }
    }
    
    Java

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

    在这里,我们创建了用于定义列表的question.hbm.xml文件。

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
        <class name="com.yiibai.Question" table="q501">
            <id name="id">
                <generator class="increment"></generator>
            </id>
            <property name="qname"></property>
    
            <bag name="answers" cascade="all">
                <key column="type"></key>
                <one-to-many class="com.yiibai.Answer" />
            </bag>
    
        </class>
    
        <class name="com.yiibai.Answer" table="ans501">
            <id name="id">
                <generator class="increment"></generator>
            </id>
            <property name="answername"></property>
            <property name="postedBy"></property>
        </class>
    
    </hibernate-mapping>
    
    XML

    3)创建配置文件

    此文件包含有关数据库和映射文件的信息。hibernate.cfg.xml文件的代码如下所示 -

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
    <!-- Generated by MyEclipse Hibernate Tools. -->
    <hibernate-configuration>
    
        <session-factory>
            <property name="hbm2ddl.auto">update</property>
    
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
            <property name="connection.username">root</property>
            <property name="connection.password">123456</property>
            <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
            <property name="show_sql">true</property>
    
            <mapping resource="question.hbm.xml" />
    
        </session-factory>
    
    </hibernate-configuration>
    
    XML

    4)创建存储数据的类

    在这个类中,我们存储Question类的数据。MainTest.java文件中的代码如下所示 -

    package com.yiibai;
    
    import java.util.ArrayList;
    
    import org.hibernate.*;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.*;
    
    public class MainTest {
        public static void main(String[] args) {
            // 但在5.1.0版本汇总,hibernate则采用如下新方式获取:
            // 1. 配置类型安全的准服务注册类,这是当前应用的单例对象,不作修改,所以声明为final
            // 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件
            final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                    .configure("hibernate.cfg.xml").build();
            // 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
            SessionFactory sessionFactory = new MetadataSources(registry)
                    .buildMetadata().buildSessionFactory();
    
            /**** 上面是配置准备,下面开始我们的数据库操作 ******/
            Session session = sessionFactory.openSession();// 从会话工厂获取一个session
    
            // creating transaction object
            Transaction t = session.beginTransaction();
    
            Answer ans1 = new Answer();
            ans1.setAnswername("java is a programming language");
            ans1.setPostedBy("Ravi Su");
    
            Answer ans2 = new Answer();
            ans2.setAnswername("java is a platform");
            ans2.setPostedBy("Sudhir Lee");
    
            Answer ans3 = new Answer();
            ans3.setAnswername("Servlet is an Interface");
            ans3.setPostedBy("Jai Wong");
    
            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");
    
        }
    }
    
    Java

    如何获取列表的数据

    在这里,我们使用HQL来获取Question类的所有记录,包括答案。 在这种情况下,它从功能相关的两个表中获取数据。 在这里,我们直接打印答案类的对象,但是我们已经在Answer类中覆盖了返回 answername和 postername 的toString()方法。 所以它打印answername 和 postername 而不是参考ID。

    FetchData.java 代码如下 -

    package com.yiibai;
    
    import java.util.*;
    
    import org.hibernate.*;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.*;
    
    public class FetchData {
        public static void main(String[] args) {
    
            // 但在5.1.0版本汇总,hibernate则采用如下新方式获取:
            // 1. 配置类型安全的准服务注册类,这是当前应用的单例对象,不作修改,所以声明为final
            // 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件
            final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                    .configure("hibernate.cfg.xml").build();
            // 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
            SessionFactory sessionFactory = new MetadataSources(registry)
                    .buildMetadata().buildSessionFactory();
    
            /**** 上面是配置准备,下面开始我们的数据库操作 ******/
            Session session = sessionFactory.openSession();// 从会话工厂获取一个session
    
            // creating transaction object
            Transaction t = session.beginTransaction();
    
            Query query = session.createQuery("from Question");
            List<Question> list = query.list();
    
            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()) {
                    System.out.println(itr2.next());
                }
    
            }
            session.close();
            System.out.println("success");
    
        }
    }
    
    Java

    运行示例

    首先运行 MainTest.java 等到以下结果 -

    log4j:WARN No appenders could be found for logger (org.jboss.logging).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Sun Mar 26 21:54:43 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    Hibernate: alter table ans501 add constraint FKtppk9gq3v1rge6ntclgp1jucm foreign key (type) references q501 (id)
    Hibernate: select max(id) from q501
    Hibernate: select max(id) from ans501
    Hibernate: insert into q501 (qname, id) values (?, ?)
    Hibernate: insert into ans501 (answername, postedBy, id) values (?, ?, ?)
    Hibernate: insert into ans501 (answername, postedBy, id) values (?, ?, ?)
    Hibernate: insert into q501 (qname, id) values (?, ?)
    Hibernate: insert into ans501 (answername, postedBy, id) values (?, ?, ?)
    Hibernate: insert into ans501 (answername, postedBy, id) values (?, ?, ?)
    Hibernate: update ans501 set type=? where id=?
    Hibernate: update ans501 set type=? where id=?
    Hibernate: update ans501 set type=? where id=?
    Hibernate: update ans501 set type=? where id=?
    success
    
    Shell

    再读取上一步中存储的信息,运行 FetchData.java 得到以下结果 -

    log4j:WARN No appenders could be found for logger (org.jboss.logging).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Sun Mar 26 21:51:56 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    Hibernate: alter table ans501 add constraint FKtppk9gq3v1rge6ntclgp1jucm foreign key (type) references q501 (id)
    Hibernate: select question0_.id as id1_1_, question0_.qname as qname2_1_ from q501 question0_
    Question Name: What is Java?
    Hibernate: select answers0_.type as type4_0_0_, answers0_.id as id1_0_0_, answers0_.id as id1_0_1_, answers0_.answername as answerna2_0_1_, answers0_.postedBy as postedBy3_0_1_ from ans501 answers0_ where answers0_.type=?
    java is a platform, PostedBy Sudhir Wong
    Servlet is an API, PostedBy Arun
    Question Name: What is Servlet?
    Hibernate: select answers0_.type as type4_0_0_, answers0_.id as id1_0_0_, answers0_.id as id1_0_1_, answers0_.answername as answerna2_0_1_, answers0_.postedBy as postedBy3_0_1_ from ans501 answers0_ where answers0_.type=?
    Question Name: What is Java?
    Hibernate: select answers0_.type as type4_0_0_, answers0_.id as id1_0_0_, answers0_.id as id1_0_1_, answers0_.answername as answerna2_0_1_, answers0_.postedBy as postedBy3_0_1_ from ans501 answers0_ where answers0_.type=?
    java is a programming language, PostedBy Ravi Su
    java is a platform, PostedBy Sudhir Lee
    Question Name: What is Servlet?
    Hibernate: select answers0_.type as type4_0_0_, answers0_.id as id1_0_0_, answers0_.id as id1_0_1_, answers0_.answername as answerna2_0_1_, answers0_.postedBy as postedBy3_0_1_ from ans501 answers0_ where answers0_.type=?
    Servlet is an Interface, PostedBy Jai Wong
    Servlet is an API, PostedBy Arun
    success
  • 相关阅读:
    如何使用Shiro
    ORACLE: 查询(看)表的主键、外键、唯一性约束和索引
    图片下载器类
    关于Android如何创建空文件夹,以及mkdir和mkdirs的区别
    图片二值化 和灰度处理方法
    InputSream转为String
    Bitmap Byte[] 互转
    静默安装/ 普通安装与root权限获取相关
    EventBus 3.0使用相关
    文件存储工具类
  • 原文地址:https://www.cnblogs.com/borter/p/9522333.html
Copyright © 2011-2022 走看看