📄 tutorial.html
字号:
这是Hibernate执行的<tt class="literal">INSERT</tt>命令,问号代表JDBC的待绑定参数。如果想要看到绑定参数的值或者减少日志的长度, 检查你在<tt class="literal">log4j.properties</tt>文件里的设置。 </p><p> 现在我们想要列出所有已经被存储的event,所以我们增加一个条件分支选项到main方法中去。 </p><pre class="programlisting">if (args[0].equals("store")) { mgr.createAndStoreEvent("My Event", new Date());}else if (args[0].equals("list")) { List events = mgr.listEvents(); for (int i = 0; i < events.size(); i++) { Event theEvent = (Event) events.get(i); System.out.println("Event: " + theEvent.getTitle() + " Time: " + theEvent.getDate()); }}</pre><p> 我们也增加一个新的<tt class="literal">listEvents()</tt>方法: </p><pre class="programlisting">private List listEvents() { Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); List result = session.createQuery("from Event").list(); tx.commit(); session.close(); return result;}</pre><p> 我们在这里是用一个HQL(Hibernate Query Language-Hibernate查询语言)查询语句来从数据库中 加载所有存在的<tt class="literal">Event</tt>。Hibernate会生成正确的SQL,发送到数据库并使用查询到的数据来生成<tt class="literal">Event</tt>对象。 当然你也可以使用HQL来创建更加复杂的查询。 </p><p> 如果你现在使用命令行参数<tt class="literal">-Daction=list</tt>来运行Ant,你会看到那些至今为止我们储存的Event。 如果你是一直一步步的跟随这个教程进行的,你也许会吃惊这个并不能工作 - 结果永远为空。原因是<tt class="literal">hbm2ddl.auto</tt> 打开了一个Hibernate的配置选项:这使得Hibernate会在每次运行的时候重新创建数据库。通过从配置里删除这个选项来禁止它。 运行了几次<tt class="literal">store</tt>之后,再运行<tt class="literal">list</tt>,你会看到结果出现在列表里。 另外,自动生成数据库表并导出在单元测试中是非常有用的。 </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>2.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>2.3.1. 映射Person类 </h3></div></div><div></div></div><p> 最初的<tt class="literal">Person</tt>类是简单的: </p><pre class="programlisting">public class Person { private Long id; private int age; private String firstname; private String lastname; Person() {} // Accessor methods for all properties, private setter for 'id'}</pre><p> Create a new mapping file called <tt class="literal">Person.hbm.xml</tt>: </p><pre class="programlisting"><hibernate-mapping> <class name="Person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="increment"/> </id> <property name="age"/> <property name="firstname"/> <property name="lastname"/> </class></hibernate-mapping></pre><p> Finally, add the new mapping to Hibernate's configuration: </p><pre class="programlisting"> <mapping resource="Event.hbm.xml"/> <mapping resource="Person.hbm.xml"/></pre><p> 我们现在将在这两个实体类之间创建一个关联。显然,person可以参与一系列Event,而Event也有不同的参加者(person)。 设计上面我们需要考虑的问题是关联的方向(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>2.3.2. 一个单向的Set-based关联 </h3></div></div><div></div></div><p> 我们将向<tt class="literal">Person</tt>类增加一组Event。这样我们可以轻松的通过调用<tt class="literal">aPerson.getEvents()</tt> 得到一个Person所参与的Event列表,而不必执行一个显式的查询。我们使用一个Java的集合类:一个<tt class="literal">Set</tt>,因为Set 不允许包括重复的元素而且排序和我们无关。 </p><p> 目前为止我们设计了一个单向的,在一端有许多值与之对应的关联,通过<tt class="literal">Set</tt>来实现。 让我们为这个在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>。 这是留给你的一个设计选项,但是从这个讨论中我们可以很清楚的了解什么是关联的阶数(multiplicity):在这个关联的两端都是“多”。 我们叫这个为:<span class="emphasis"><em>多对多(many-to-many)</em></span>关联。因此,我们使用Hibernate的many-to-many映射: </p><pre class="programlisting"><class name="Person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="increment"/> </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="Event"/> </set></class></pre><p> Hibernate支持所有种类的集合映射,<tt class="literal"><set></tt>是最普遍被使用的。对于多对多(many-to-many)关联(或者叫<span class="emphasis"><em>n:m</em></span>实体关系), 需要一个用来
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -