📄 tutorial.html
字号:
Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List result = session.createQuery("from Event").list(); session.getTransaction().commit(); return result;}</pre><p> 我们在这里是用一个HQL(Hibernate Query Language-Hibernate查询语言)查询语句来从数据库中加载所有存在的<tt class="literal">Event</tt>对象。Hibernate会生成适当的SQL,把它发送到数据库,并操作从查询得到数据的<tt class="literal">Event</tt>对象。当然,你可以使用HQL来创建更加复杂的查询。 </p><p> 现在,根据以下步骤来执行并测试以上各项: </p><div class="itemizedlist"><ul type="disc"><li><p> 运行<tt class="literal">ant run -Daction=store</tt>来保存一些内容到数据库。当然,先得用hbm2ddl来生成数据库schema。 </p></li><li><p> 现在把<tt class="literal">hibernate.cfg.xml</tt>文件中hbm2ddl属性注释掉,这样我们就取消了在启动时用hbm2ddl来生成数据库schema。通常只有在不断重复进行单元测试的时候才需要打开它,但再次运行hbm2ddl会把你保存的一切都删掉(<span class="emphasis"><em>drop</em></span>)——<tt class="literal">create</tt>配置的真实含义是:“在创建SessionFactory的时候,从schema 中drop 掉所有的表,再重新创建它们”。 </p></li></ul></div><p> 如果你现在使用命令行参数<tt class="literal">-Daction=list</tt>运行Ant,你会看到那些至今为止我们所储存的events。当然,你也可以多调用几次<tt class="literal">store</tt>以保存更多的envents。 </p><p> 注意,很多Hibernate新手在这一步会失败,我们不时看到关于<span class="emphasis"><em>Table not found</em></span>错误信息的提问。但是,只要你根据上面描述的步骤来执行,就不会有这个问题,因为hbm2ddl会在第一次运行的时候创建数据库schema,后继的应用程序重起后还能继续使用这个schema。假若你修改了映射,或者修改了数据库schema,你必须把hbm2ddl重新打开一次。 </p></div></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="tutorial-associations"></a>1.3. 第二部分 - 关联映射 </h2></div></div><div></div></div><p> 我们已经映射了一个持久化实体类到表上。让我们在这个基础上增加一些类之间的关联。首先我们往应用程序里增加人(people)的概念,并存储他们所参与的一个Event列表。(译者注:与Event一样,我们在后面将直接使用person来表示“人”而不是它的中文翻译) </p><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="tutorial-associations-mappinguser"></a>1.3.1. 映射Person类 </h3></div></div><div></div></div><p> 最初简单的<tt class="literal">Person</tt>类: </p><pre class="programlisting">package events;public class Person { private Long id; private int age; private String firstname; private String lastname; public Person() {} // Accessor methods for all properties, private setter for 'id'}</pre><p> 创建一个名为<tt class="literal">Person.hbm.xml</tt>的新映射文件(别忘了最上面的DTD引用): </p><pre class="programlisting"><hibernate-mapping> <class name="events.Person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="native"/> </id> <property name="age"/> <property name="firstname"/> <property name="lastname"/> </class></hibernate-mapping></pre><p> 最后,把新的映射加入到Hibernate的配置中: </p><pre class="programlisting"><mapping resource="events/Event.hbm.xml"/><mapping resource="events/Person.hbm.xml"/></pre><p> 现在我们在这两个实体之间创建一个关联。显然,persons可以参与一系列events,而events也有不同的参加者(persons)。我们需要处理的设计问题是关联方向(directionality),阶数(multiplicity)和集合(collection)的行为。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="tutorial-associations-unidirset"></a>1.3.2. 单向Set-based的关联 </h3></div></div><div></div></div><p> 我们将向<tt class="literal">Person</tt>类增加一连串的events。那样,通过调用<tt class="literal">aPerson.getEvents()</tt>,就可以轻松地导航到特定person所参与的events,而不用去执行一个显式的查询。我们使用Java的集合类(collection):<tt class="literal">Set</tt>,因为set 不包含重复的元素及与我们无关的排序。 </p><p> 我们需要用set 实现一个单向多值关联。让我们在Java类里为这个关联编码,接着映射它: </p><pre class="programlisting">public class Person { private Set events = new HashSet(); public Set getEvents() { return events; } public void setEvents(Set events) { this.events = events; }}</pre><p> 在映射这个关联之前,先考虑一下此关联的另外一端。很显然,我们可以保持这个关联是单向的。或者,我们可以在<tt class="literal">Event</tt>里创建另外一个集合,如果希望能够双向地导航,如:<tt class="literal">anEvent.getParticipants()</tt>。从功能的角度来说,这并不是必须的。因为你总可以显式地执行一个查询,以获得某个特定event的所有参与者。这是个在设计时需要做出的选择,完全由你来决定,但此讨论中关于关联的阶数是清楚的:即两端都是“多”值的,我们把它叫做<span class="emphasis"><em>多对多(many-to-many)</em></span>关联。因而,我们使用Hibernate的多对多映射: </p><pre class="programlisting"><class name="events.Person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="native"/> </id> <property name="age"/> <property name="firstname"/> <property name="lastname"/> <set name="events" table="PERSON_EVENT"> <key column="PERSON_ID"/> <many-to-many column="EVENT_ID" class="events.Event"/> </set></class></pre><p> Hibernate支持各种各样的集合映射,<tt class="literal"><set></tt>使用的最为普遍。对于多对多关联(或叫<span class="emphasis"><em>n:m</em></span>实体关系), 需要一个关联表(association table)。<tt class="literal">表</tt>里面的每一行代表从person到event的一个关联。表名是由<tt class="literal">set</tt>元素的<tt class="literal">table</tt>属性配置
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -