JPA入门例子(采用JPA的hibernate实现版本)
2017-04-12 17:24
531 查看
<div id="article_details" class="details">
<div class="article_title">
<span class="ico ico_type_Original"></span>
<h1>
<span class="link_title"><a href="/hmk2011/article/details/6289151">
JPA入门例子(采用JPA的hibernate实现版本)
</a></span>
</h1>
</div>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/jpa" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">jpa</a><a href="http://www.csdn.net/tag/hibernate" target="_blank" onclick="_gaq.push(['_trackEvent','function',
'onclick', 'blog_articles_tag']);">hibernate</a><a href="http://www.csdn.net/tag/%e6%95%b0%e6%8d%ae%e5%ba%93" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">数据库</a><a href="http://www.csdn.net/tag/jdbc" target="_blank"
onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">jdbc</a><a href="http://www.csdn.net/tag/java" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">java</a><a href="http://www.csdn.net/tag/%e6%a1%86%e6%9e%b6"
target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">框架</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2011-03-30 16:09</span>
<span class="link_view" title="阅读次数">115198人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(20)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('JPA%e5%85%a5%e9%97%a8%e4%be%8b%e5%ad%90(%e9%87%87%e7%94%a8JPA%e7%9a%84hibernate%e5%ae%9e%e7%8e%b0%e7%89%88%e6%9c%ac)','6289151');return
false;" title="收藏">收藏</a></span>
<span class="link_report"> <a href="#report" onclick="javascript:report(6289151,2);return false;" title="举报">举报</a></span>
</div>
</div>
<div class="embody" style="display:none" id="embody">
<span class="embody_t">本文章已收录于:</span>
<div class="embody_c" id="lib" value="{"err":0,"msg":"ok","data":[]}"></div>
</div>
<style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
4000
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label onclick="GetCategoryArticles('793467','hmk2011','top','6289151');">
<span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">j2se<em>(5)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
<div class="subItem">
<div class="subItem_t"><a href="http://blog.csdn.net/hmk2011/article/category/793467" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_793467">
</ul>
</div>
</label>
</div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>
<div class="bog_copyright">
<p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
</div>
<div id="article_content" class="article_content">
<p><strong>(1)、JPA介绍:</strong></p>
<p> <span style="font-size: small;">JPA全称为<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java </a>Persistence API ,<a href="http://lib.csdn.net/base/javase"
class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>持久化API是Sun公司在<a href="http://lib.csdn.net/base/javaee" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java
EE</a> 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。 </span></p>
<p><span style="font-size: small;"><strong><span style="text-decoration: underline;"> 为什么要使用JAP?<br></span></strong> 在说为什么要使用JPA之前,我们有必要了解为什么要使用ORM技术。</span></p>
<p><span style="font-size: small;">ORM 是Object-Relation-Mapping,即对象关系影射技术,是对象持久化的核心。ORM是对JDBC的封装,从而解决了JDBC的各种存在问题:</span></p>
<p><span style="font-size: small;">a) 繁琐的代码问题</span></p>
<p><span style="font-size: small;">用JDBC的API编程访问<a href="http://lib.csdn.net/base/mysql" class="replace_word" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">数据库</a>,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。例如:PreparedStatement pstmt=con.prepareStatment("insert
into account value(?,?,?,?,?,?,?,?,?)");</span></p>
<p><span style="font-size: small;">ORM则建立了Java对象与数据库对象之间的影射关系,程序员不需要编写复杂的SQL语句,直接操作Java对象即可,从而大大降低了代码量,也使程序员更加专注于业务逻辑的实现。</span></p>
<p><span style="font-size: small;">b) 数据库对象连接问题</span></p>
<p><span style="font-size: small;">关系数据对象之间,存在各种关系,包括1对1、1对多、多对1、多对多、级联等。在数据库对象更新的时候,采用JDBC编程,必须十分小心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很费时费力的过程。</span></p>
<p><span style="font-size: small;">ORM建立Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系创建Java对象的关系,并且提供了维持这些关系完整、有效的机制。</span></p>
<p><span style="font-size: small;">c) 系统<a href="http://lib.csdn.net/base/architecture" class="replace_word" title="大型网站架构知识库" target="_blank" style="color:#df3434; font-weight:bold;">架构</a>问题</span></p>
<p><span style="font-size: small;">JDBC属于数据访问层,但是使用JDBC编程时,必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创建了什么索引等等与后台数据库相关的详细信息。</span></p>
<p><span style="font-size: small;">使用ORM技术,可以将数据库层完全隐蔽,呈献给程序员的只有Java的对象,程序员只需要根据业务逻辑的需要调用Java对象的Getter和 Setter方法,即可实现对后台数据库的操作,程序员不必知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。</span></p>
<p><span style="font-size: small;">d) 性能问题</span></p>
<p><span style="font-size: small;">采用JDBC编程,在很多时候存在效率低下的问题。</span></p>
<p><span style="font-size: small;">pstmt =conn.prepareStatement("insert into user_info values(?,?)");<br> for (int i=0; i<1000; i++) {<br> pstmt.setInt(1,i);<br>
pstmt.setString(2,"User"+i.toString());<br> pstmt.executeUpdate();<br> }</span></p>
<p><span style="font-size: small;">以上程序将向后台数据库发送1000次SQL语句执行请求,运行效率较低。</span></p>
<p><span style="font-size: small;">采用ORM技术,ORM框架将根据具体数据库操作需要,会自动延迟向后台数据库发送SQL请求,ORM也可以根据实际情况,将数据库访问操作合成,尽量减少不必要的数据库操作请求。</span></p>
<p><span style="font-size: small;"> </span></p>
<p><span style="font-size: small;">JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势:</span></p>
<p><span style="font-size: small;">1 标准化<br> JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。<br>2 对容器级特性的支持<br> JPA 框架中支持<a href="http://lib.csdn.net/base/hadoop" class="replace_word" title="Hadoop知识库"
target="_blank" style="color:#df3434; font-weight:bold;">大数据</a>集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。<br>3 简单易用,集成方便<br> JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。<br>4
可媲美JDBC的查询能力<br> JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是<a href="http://lib.csdn.net/base/javaee" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">hibernate</a> HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query
Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。<br>5 支持面向对象的高级特性<br> JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。</span></p>
<p> </p>
<p> </p>
<p><span style="font-size: medium;">(2)、具体例子</span></p>
<p><span style="font-size: medium;"> 完成工程后工程结构如下图:</span></p>
<p><span style="font-size: medium;"> <img src="http://hi.csdn.net/attachment/201103/30/0_1301471964jJ84.gif" alt=""></span></p>
<p><span style="font-size: medium;"><strong> <span style="color: #ff0000;">(注意:persistence.xml文件的位置决定持久性的根(Persistence Root)。持久性的根为JAR文件或者包含META-INF目录(前提是persistence.xml位于此)的目录。一般将这个persistence.xml文件放在src下的META-INF中。命名及位置都不能变)</span></strong></span></p>
<p> </p>
<p><span style="font-size: small;">a)、导入相关jar包(见上图)和创建<span style="color: #ff0000;">META-INF和persistence.xml文件.</span></span></p>
<p><span style="font-size: small;">persistence.xml配置如下:(我用的数据为<a href="http://lib.csdn.net/base/mysql" class="replace_word" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">MySQL</a>,采用不同数据库及JPA的不同实现版本会导致配置内容不同)</span></p>
<p> <div class="dp-highlighter bg_xhtml"><div class="bar"><div class="tools"><b>[xhtml]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168">
<a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 573px; top: 2665px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1"
src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return
false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span cl
177bc
ass="tag-name">persistence</span><span> </span><span
class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/persistence"</span><span> </span></span></li><li class=""><span> <span class="attribute">xmlns:xsi</span><span>=</span><span
class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">xsi:schemaLocation</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_version=1"</span><span
class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">persistence-unit</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"mysqlJPA"</span><span> </span><span
class="attribute">transaction-type</span><span>=</span><span class="attribute-value">"RESOURCE_LOCAL"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span
class="tag-name">properties</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span
class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.dialect"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"org.hibernate.dialect.MySQL5Dialect"</span><span> </span><span
class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span
class="attribute-value">"hibernate.connection.driver_class"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"com.mysql.jdbc.Driver"</span><span> </span><span class="tag">/></span><span> </span></span></li><li
class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.connection.username"</span><span> </span><span
class="attribute">value</span><span>=</span><span class="attribute-value">"root"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span
class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.connection.password"</span><span> </span><span class="attribute">value</span><span>=</span><span
class="attribute-value">"123456"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span
class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.connection.url"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"jdbc:mysql://localhost:3306/db1"</span><span> </span><span
class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span
class="attribute-value">"hibernate.max_fetch_depth"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"3"</span><span> </span><span class="tag">/></span><span> </span></span></li><li
class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.hbm2ddl.auto"</span><span> </span><span
class="attribute">value</span><span>=</span><span class="attribute-value">"update"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span
class="tag-name">properties</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">persistence-unit</span><span class="tag">></span><span> </span></span></li><li
class="alt"><span><span class="tag"></</span><span class="tag-name">persistence</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img
src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><textarea cols="80" rows="15" name="code" class="xhtml" style="display: none;"><persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_version=1"> <persistence-unit name="mysqlJPA" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db1" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence></textarea> </p>
<p> </p>
<p><span style="font-size: small;">b)、编写实体bean,如下:</span></p>
<p> <div class="dp-highlighter bg_c-sharp"><div class="bar"><div class="tools"><b>[c-sharp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168">
<a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 585px; top: 3127px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2"
src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return
false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-c"><li class="alt"><span><span>package com.hmk.bean; </span></span></li><li class=""><span> </span></li><li
class="alt"><span>import javax.persistence.Column; </span></li><li class=""><span>import javax.persistence.Entity; </span></li><li class="alt"><span>import javax.persistence.GeneratedValue; </span></li><li class=""><span>import javax.persistence.Id; </span></li><li
class="alt"><span> </span></li><li class=""><span>@Entity </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Person { </span></span></li><li
class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> id; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String name; </span></span></li><li
class=""><span> </span></li><li class="alt"><span> @Id @GeneratedValue </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span
class="keyword">int</span><span> getId() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> id; </span></span></li><li class=""><span> } </span></li><li
class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setId(</span><span class="keyword">int</span><span> id) { </span></span></li><li class=""><span> <span
class="keyword">this</span><span>.id = id; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> @Column(length=12) </span></li><li class="alt"><span> <span
class="keyword">public</span><span> String getName() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> name; </span></span></li><li class="alt"><span> } </span></li><li
class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setName(String name) { </span></span></li><li class="alt"><span> <span
class="keyword">this</span><span>.name = name; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol><div
class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><textarea cols="81" rows="15" name="code" class="c-sharp" style="display: none;">package
com.hmk.bean;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
private int id;
private String name;
@Id @GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(length=12)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
</textarea> </p>
<p> </p>
<p><span style="font-size: small;">c)、编写junit<a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>代码,如下:</span></p>
<p> </p>
<p> <div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168">
<a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 563px; top: 3886px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3"
src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return
false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> junit.test; </span></span></li><li
class=""><span> </span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> javax.persistence.EntityManager; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> javax.persistence.EntityManagerFactory; </span></span></li><li
class=""><span><span class="keyword">import</span><span> javax.persistence.Persistence; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> org.junit.BeforeClass; </span></span></li><li
class="alt"><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.hmk.bean.Person; </span></span></li><li
class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> JpaTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@BeforeClass</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> setUpBeforeClass() </span><span
class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> createTable(){ </span></span></li><li class=""><span> <span
class="comment">//可以验证生成表是否正确</span><span> </span></span></li><li class="alt"><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span class="string">"mysqlJPA"</span><span>); </span></span></li><li
class=""><span> factory.close(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> save(){ </span></span></li><li class=""><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class="alt"><span> EntityManager em = factory.createEntityManager(); </span></li><li class=""><span> em.getTransaction().begin(); </span></li><li
class="alt"><span> Person person = <span class="keyword">new</span><span> Person(); </span><span class="comment">//person为new状态</span><span> </span></span></li><li class=""><span> person.setName(<span
class="string">"zhang san"</span><span>); </span></span></li><li class="alt"><span> em.persist(person); <span class="comment">//持久化实体</span><span> </span></span></li><li class=""><span> em.getTransaction().commit(); </span></li><li
class="alt"><span> em.close(); </span></li><li class=""><span> factory.close(); </span></li><li class="alt"><span> } </span></li><li
class=""><span> <span class="comment">//new 、托管、脱管、删除</span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span><span
class="keyword">public</span><span> </span><span class="keyword">void</span><span> update(){ </span></span></li><li class="alt"><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class=""><span> EntityManager em = factory.createEntityManager(); </span></li><li class="alt"><span> em.getTransaction().begin(); </span></li><li
class=""><span> Person person = em.find(Person.<span class="keyword">class</span><span>, </span><span class="number">1</span><span>); </span></span></li><li class="alt"><span> person.setName(<span
class="string">"hmk"</span><span>); </span><span class="comment">//person为托管状态</span><span> </span></span></li><li class=""><span> em.getTransaction().commit(); </span></li><li class="alt"><span> em.close(); </span></li><li
class=""><span> factory.close(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> update2(){ </span></span></li><li class=""><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class="alt"><span> EntityManager em = factory.createEntityManager(); </span></li><li class=""><span> em.getTransaction().begin(); </span></li><li
class="alt"><span> Person person = em.find(Person.<span class="keyword">class</span><span>, </span><span class="number">1</span><span>); </span></span></li><li class=""><span> em.clear(); <span
class="comment">//把实体管理器中的所有实体变为脱管状态</span><span> </span></span></li><li class="alt"><span> person.setName(<span class="string">"hmk2"</span><span>); </span></span></li><li class=""><span> em.merge(person); <span
class="comment">//把脱管状态变为托管状态,merge可以自动选择insert or update 数据</span><span> </span></span></li><li class="alt"><span> em.getTransaction().commit(); </span></li><li class=""><span> em.close(); </span></li><li
class="alt"><span> factory.close(); </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> remove(){ </span></span></li><li class="alt"><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class=""><span> EntityManager em = factory.createEntityManager(); </span></li><li class="alt"><span> em.getTransaction().begin(); </span></li><li
class=""><span> Person person = em.find(Person.<span class="keyword">class</span><span>, </span><span class="number">1</span><span>); </span></span></li><li class="alt"><span> em.remove(person); <span
class="comment">//删除实体</span><span> </span></span></li><li class=""><span> em.getTransaction().commit(); </span></li><li class="alt"><span> em.close(); </span></li><li
class=""><span> factory.close(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> find(){ </span></span></li><li class=""><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class="alt"><span> EntityManager em = factory.createEntityManager(); </span></li><li class=""><span> Person person = em.find(Person.<span
class="keyword">class</span><span>, </span><span class="number">2</span><span>); </span><span class="comment">//类似于hibernate的get方法,没找到数据时,返回null</span><span> </span></span></li><li class="alt"><span> System.out.println(person.getName()); </span></li><li
class=""><span> em.close(); </span></li><li class="alt"><span> factory.close(); </span></li><li class=""><span> } </span></li><li
class="alt"><span> <span class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> find2(){ </span></span></li><li class=""><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class="alt"><span> EntityManager em = factory.createEntityManager(); </span></li><li class=""><span> Person person = em.getReference(Person.<span
class="keyword">class</span><span>, </span><span class="number">2</span><span>); </span><span class="comment">//类似于hibernate的load方法,延迟加载.没相应数据时会出现异常</span><span> </span></span></li><li class="alt"><span> System.out.println(person.getName()); <span
class="comment">//真正调用时才查找数据</span><span> </span></span></li><li class=""><span> em.close(); </span></li><li class="alt"><span> factory.close(); </span></li><li
class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><textarea
cols="80" rows="15" name="code" class="java" style="display: none;">package junit.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
import com.hmk.bean.Person;
public class JpaTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void createTable(){
//可以验证生成表是否正确
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
factory.close();
}
@Test public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = new Person(); //person为new状态
person.setName("zhang san");
em.persist(person); //持久化实体
em.getTransaction().commit();
em.close();
factory.close();
}
//new 、托管、脱管、删除
@Test public void update(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
person.setName("hmk"); //person为托管状态
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void update2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.clear(); //把实体管理器中的所有实体变为脱管状态
person.setName("hmk2");
em.merge(person); //把脱管状态变为托管状态,merge可以自动选择insert or update 数据
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void remove(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.remove(person); //删除实体
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void find(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 2); //类似于hibernate的get方法,没找到数据时,返回null
System.out.println(person.getName());
em.close();
factory.close();
}
@Test public void find2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.getReference(Person.class, 2); //类似于hibernate的load方法,延迟加载.没相应数据时会出现异常
System.out.println(person.getName()); //真正调用时才查找数据
em.close();
factory.close();
}
}
</textarea> </p>
<p> </p>
<p> </p>
<p><span style="font-size: small;">d)、运行junit测试代码里的相应方法就行可以。</span></p>
<p> </p>
<p> </p>
</div>
<!-- Baidu Button BEGIN -->
<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1491988006064">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src
= 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->
<link rel="stylesheet" href="http://static.blog.csdn.net/css/blog_detail.css">
<!--172.16.140.11-->
<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=414442"></script>
<script type="text/javascript">
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->
<script type="text/javascript">
var fromjs = $("#fromjs");
if (fromjs.length > 0) {
$("#fromjs .markdown_views pre").addClass("prettyprint");
prettyPrint();
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
$('.pre-numbering li').css("color", "#999");
}
</script>
<div id="digg" articleid="6289151">
<dl id="btnDigg" class="digg digg_disable" onclick="btndigga();">
<dt>顶</dt>
<dd>14</dd>
</dl>
<dl id="btnBury" class="digg digg_disable" onclick="btnburya();">
<dt>踩</dt>
<dd>5</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<ul class="article_next_prev">
<li class="prev_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='/hmk2011/article/details/6283283';">上一篇</span><a href="/hmk2011/article/details/6283283" onclick="_gaq.push(['_trackEvent','function',
'onclick', 'blog_articles_shangyipian'])">spring AOP实现(Annotation方式/静态文件配置方式)</a></li>
</ul>
<div style="clear:both; height:10px;"></div>
<div class="similar_article" style="">
<h4>我的同类文章</h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
<label class="similar_cur">
<span style="cursor:pointer" onclick="GetCategoryArticles('793467','hmk2011','foot','6289151');">j2se<em>(5)</em></span>
</label>
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
<a href="http://blog.csdn.net" style="display:none">http://blog.csdn.net</a>
<ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/hmk2011/article/details/6259572" id="foot_aritcle_6259572undefined24386708387433087" target="_blank" title="CGLIB入门编程例子">CGLIB入门编程例子</a><span>2011-03-18</span><label><i>阅读</i><b>1726</b></label></li>
<li><em>•</em><a href="http://blog.csdn.net/hmk2011/article/details/6232494" id="foot_aritcle_6232494undefined6730189866053025" target="_blank" title="java设计模式-代理模式">java设计模式-代理模式</a><span>2011-03-08</span><label><i>阅读</i><b>354</b></label></li> <li><em>•</em><a
href="http://blog.csdn.net/hmk2011/article/details/6230843" id="foot_aritcle_6230843undefined9501011803703079" target="_blank" title="正确使用 Volatile 变量">正确使用 Volatile 变量</a><span>2011-03-08</span><label><i>阅读</i><b>350</b></label></li> </ul>
<ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/hmk2011/article/details/6249281" id="foot_aritcle_6249281undefined5696538307376082" target="_blank" title="Java设计模式-单例模式">Java设计模式-单例模式</a><span>2011-03-14</span><label><i>阅读</i><b>484</b></label></li>
<li><em>•</em><a href="http://blog.csdn.net/hmk2011/article/details/6231275" id="foot_aritcle_6231275undefined008780324893189473" target="_blank" title="Java线程:并发协作-生产者消费者模型">Java线程:并发协作-生产者消费者模型</a><span>2011-03-08</span><label><i>阅读</i><b>419</b></label></li>
</ul>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
GetCategoryArticles('793467', 'hmk2011','foot','6289151');
});
</script>
</div>
<div class="article_title">
<span class="ico ico_type_Original"></span>
<h1>
<span class="link_title"><a href="/hmk2011/article/details/6289151">
JPA入门例子(采用JPA的hibernate实现版本)
</a></span>
</h1>
</div>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/jpa" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">jpa</a><a href="http://www.csdn.net/tag/hibernate" target="_blank" onclick="_gaq.push(['_trackEvent','function',
'onclick', 'blog_articles_tag']);">hibernate</a><a href="http://www.csdn.net/tag/%e6%95%b0%e6%8d%ae%e5%ba%93" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">数据库</a><a href="http://www.csdn.net/tag/jdbc" target="_blank"
onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">jdbc</a><a href="http://www.csdn.net/tag/java" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">java</a><a href="http://www.csdn.net/tag/%e6%a1%86%e6%9e%b6"
target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">框架</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2011-03-30 16:09</span>
<span class="link_view" title="阅读次数">115198人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(20)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('JPA%e5%85%a5%e9%97%a8%e4%be%8b%e5%ad%90(%e9%87%87%e7%94%a8JPA%e7%9a%84hibernate%e5%ae%9e%e7%8e%b0%e7%89%88%e6%9c%ac)','6289151');return
false;" title="收藏">收藏</a></span>
<span class="link_report"> <a href="#report" onclick="javascript:report(6289151,2);return false;" title="举报">举报</a></span>
</div>
</div>
<div class="embody" style="display:none" id="embody">
<span class="embody_t">本文章已收录于:</span>
<div class="embody_c" id="lib" value="{"err":0,"msg":"ok","data":[]}"></div>
</div>
<style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
4000
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label onclick="GetCategoryArticles('793467','hmk2011','top','6289151');">
<span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">j2se<em>(5)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
<div class="subItem">
<div class="subItem_t"><a href="http://blog.csdn.net/hmk2011/article/category/793467" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_793467">
</ul>
</div>
</label>
</div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>
<div class="bog_copyright">
<p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
</div>
<div id="article_content" class="article_content">
<p><strong>(1)、JPA介绍:</strong></p>
<p> <span style="font-size: small;">JPA全称为<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java </a>Persistence API ,<a href="http://lib.csdn.net/base/javase"
class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>持久化API是Sun公司在<a href="http://lib.csdn.net/base/javaee" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java
EE</a> 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。 </span></p>
<p><span style="font-size: small;"><strong><span style="text-decoration: underline;"> 为什么要使用JAP?<br></span></strong> 在说为什么要使用JPA之前,我们有必要了解为什么要使用ORM技术。</span></p>
<p><span style="font-size: small;">ORM 是Object-Relation-Mapping,即对象关系影射技术,是对象持久化的核心。ORM是对JDBC的封装,从而解决了JDBC的各种存在问题:</span></p>
<p><span style="font-size: small;">a) 繁琐的代码问题</span></p>
<p><span style="font-size: small;">用JDBC的API编程访问<a href="http://lib.csdn.net/base/mysql" class="replace_word" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">数据库</a>,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。例如:PreparedStatement pstmt=con.prepareStatment("insert
into account value(?,?,?,?,?,?,?,?,?)");</span></p>
<p><span style="font-size: small;">ORM则建立了Java对象与数据库对象之间的影射关系,程序员不需要编写复杂的SQL语句,直接操作Java对象即可,从而大大降低了代码量,也使程序员更加专注于业务逻辑的实现。</span></p>
<p><span style="font-size: small;">b) 数据库对象连接问题</span></p>
<p><span style="font-size: small;">关系数据对象之间,存在各种关系,包括1对1、1对多、多对1、多对多、级联等。在数据库对象更新的时候,采用JDBC编程,必须十分小心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很费时费力的过程。</span></p>
<p><span style="font-size: small;">ORM建立Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系创建Java对象的关系,并且提供了维持这些关系完整、有效的机制。</span></p>
<p><span style="font-size: small;">c) 系统<a href="http://lib.csdn.net/base/architecture" class="replace_word" title="大型网站架构知识库" target="_blank" style="color:#df3434; font-weight:bold;">架构</a>问题</span></p>
<p><span style="font-size: small;">JDBC属于数据访问层,但是使用JDBC编程时,必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创建了什么索引等等与后台数据库相关的详细信息。</span></p>
<p><span style="font-size: small;">使用ORM技术,可以将数据库层完全隐蔽,呈献给程序员的只有Java的对象,程序员只需要根据业务逻辑的需要调用Java对象的Getter和 Setter方法,即可实现对后台数据库的操作,程序员不必知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。</span></p>
<p><span style="font-size: small;">d) 性能问题</span></p>
<p><span style="font-size: small;">采用JDBC编程,在很多时候存在效率低下的问题。</span></p>
<p><span style="font-size: small;">pstmt =conn.prepareStatement("insert into user_info values(?,?)");<br> for (int i=0; i<1000; i++) {<br> pstmt.setInt(1,i);<br>
pstmt.setString(2,"User"+i.toString());<br> pstmt.executeUpdate();<br> }</span></p>
<p><span style="font-size: small;">以上程序将向后台数据库发送1000次SQL语句执行请求,运行效率较低。</span></p>
<p><span style="font-size: small;">采用ORM技术,ORM框架将根据具体数据库操作需要,会自动延迟向后台数据库发送SQL请求,ORM也可以根据实际情况,将数据库访问操作合成,尽量减少不必要的数据库操作请求。</span></p>
<p><span style="font-size: small;"> </span></p>
<p><span style="font-size: small;">JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势:</span></p>
<p><span style="font-size: small;">1 标准化<br> JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。<br>2 对容器级特性的支持<br> JPA 框架中支持<a href="http://lib.csdn.net/base/hadoop" class="replace_word" title="Hadoop知识库"
target="_blank" style="color:#df3434; font-weight:bold;">大数据</a>集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。<br>3 简单易用,集成方便<br> JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。<br>4
可媲美JDBC的查询能力<br> JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是<a href="http://lib.csdn.net/base/javaee" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">hibernate</a> HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query
Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。<br>5 支持面向对象的高级特性<br> JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。</span></p>
<p> </p>
<p> </p>
<p><span style="font-size: medium;">(2)、具体例子</span></p>
<p><span style="font-size: medium;"> 完成工程后工程结构如下图:</span></p>
<p><span style="font-size: medium;"> <img src="http://hi.csdn.net/attachment/201103/30/0_1301471964jJ84.gif" alt=""></span></p>
<p><span style="font-size: medium;"><strong> <span style="color: #ff0000;">(注意:persistence.xml文件的位置决定持久性的根(Persistence Root)。持久性的根为JAR文件或者包含META-INF目录(前提是persistence.xml位于此)的目录。一般将这个persistence.xml文件放在src下的META-INF中。命名及位置都不能变)</span></strong></span></p>
<p> </p>
<p><span style="font-size: small;">a)、导入相关jar包(见上图)和创建<span style="color: #ff0000;">META-INF和persistence.xml文件.</span></span></p>
<p><span style="font-size: small;">persistence.xml配置如下:(我用的数据为<a href="http://lib.csdn.net/base/mysql" class="replace_word" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">MySQL</a>,采用不同数据库及JPA的不同实现版本会导致配置内容不同)</span></p>
<p> <div class="dp-highlighter bg_xhtml"><div class="bar"><div class="tools"><b>[xhtml]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168">
<a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 573px; top: 2665px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1"
src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return
false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span cl
177bc
ass="tag-name">persistence</span><span> </span><span
class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/persistence"</span><span> </span></span></li><li class=""><span> <span class="attribute">xmlns:xsi</span><span>=</span><span
class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">xsi:schemaLocation</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_version=1"</span><span
class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">persistence-unit</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"mysqlJPA"</span><span> </span><span
class="attribute">transaction-type</span><span>=</span><span class="attribute-value">"RESOURCE_LOCAL"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span
class="tag-name">properties</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span
class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.dialect"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"org.hibernate.dialect.MySQL5Dialect"</span><span> </span><span
class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span
class="attribute-value">"hibernate.connection.driver_class"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"com.mysql.jdbc.Driver"</span><span> </span><span class="tag">/></span><span> </span></span></li><li
class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.connection.username"</span><span> </span><span
class="attribute">value</span><span>=</span><span class="attribute-value">"root"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span
class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.connection.password"</span><span> </span><span class="attribute">value</span><span>=</span><span
class="attribute-value">"123456"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span
class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.connection.url"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"jdbc:mysql://localhost:3306/db1"</span><span> </span><span
class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span
class="attribute-value">"hibernate.max_fetch_depth"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"3"</span><span> </span><span class="tag">/></span><span> </span></span></li><li
class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"hibernate.hbm2ddl.auto"</span><span> </span><span
class="attribute">value</span><span>=</span><span class="attribute-value">"update"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span
class="tag-name">properties</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">persistence-unit</span><span class="tag">></span><span> </span></span></li><li
class="alt"><span><span class="tag"></</span><span class="tag-name">persistence</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img
src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><textarea cols="80" rows="15" name="code" class="xhtml" style="display: none;"><persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_version=1"> <persistence-unit name="mysqlJPA" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db1" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence></textarea> </p>
<p> </p>
<p><span style="font-size: small;">b)、编写实体bean,如下:</span></p>
<p> <div class="dp-highlighter bg_c-sharp"><div class="bar"><div class="tools"><b>[c-sharp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168">
<a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 585px; top: 3127px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2"
src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return
false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-c"><li class="alt"><span><span>package com.hmk.bean; </span></span></li><li class=""><span> </span></li><li
class="alt"><span>import javax.persistence.Column; </span></li><li class=""><span>import javax.persistence.Entity; </span></li><li class="alt"><span>import javax.persistence.GeneratedValue; </span></li><li class=""><span>import javax.persistence.Id; </span></li><li
class="alt"><span> </span></li><li class=""><span>@Entity </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Person { </span></span></li><li
class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> id; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String name; </span></span></li><li
class=""><span> </span></li><li class="alt"><span> @Id @GeneratedValue </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span
class="keyword">int</span><span> getId() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> id; </span></span></li><li class=""><span> } </span></li><li
class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setId(</span><span class="keyword">int</span><span> id) { </span></span></li><li class=""><span> <span
class="keyword">this</span><span>.id = id; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> @Column(length=12) </span></li><li class="alt"><span> <span
class="keyword">public</span><span> String getName() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> name; </span></span></li><li class="alt"><span> } </span></li><li
class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setName(String name) { </span></span></li><li class="alt"><span> <span
class="keyword">this</span><span>.name = name; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li></ol><div
class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><textarea cols="81" rows="15" name="code" class="c-sharp" style="display: none;">package
com.hmk.bean;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
private int id;
private String name;
@Id @GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(length=12)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
</textarea> </p>
<p> </p>
<p><span style="font-size: small;">c)、编写junit<a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>代码,如下:</span></p>
<p> </p>
<p> <div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168">
<a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 563px; top: 3886px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3"
src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return
false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> junit.test; </span></span></li><li
class=""><span> </span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> javax.persistence.EntityManager; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> javax.persistence.EntityManagerFactory; </span></span></li><li
class=""><span><span class="keyword">import</span><span> javax.persistence.Persistence; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> org.junit.BeforeClass; </span></span></li><li
class="alt"><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.hmk.bean.Person; </span></span></li><li
class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> JpaTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@BeforeClass</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> setUpBeforeClass() </span><span
class="keyword">throws</span><span> Exception { </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> createTable(){ </span></span></li><li class=""><span> <span
class="comment">//可以验证生成表是否正确</span><span> </span></span></li><li class="alt"><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span class="string">"mysqlJPA"</span><span>); </span></span></li><li
class=""><span> factory.close(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> save(){ </span></span></li><li class=""><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class="alt"><span> EntityManager em = factory.createEntityManager(); </span></li><li class=""><span> em.getTransaction().begin(); </span></li><li
class="alt"><span> Person person = <span class="keyword">new</span><span> Person(); </span><span class="comment">//person为new状态</span><span> </span></span></li><li class=""><span> person.setName(<span
class="string">"zhang san"</span><span>); </span></span></li><li class="alt"><span> em.persist(person); <span class="comment">//持久化实体</span><span> </span></span></li><li class=""><span> em.getTransaction().commit(); </span></li><li
class="alt"><span> em.close(); </span></li><li class=""><span> factory.close(); </span></li><li class="alt"><span> } </span></li><li
class=""><span> <span class="comment">//new 、托管、脱管、删除</span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span><span
class="keyword">public</span><span> </span><span class="keyword">void</span><span> update(){ </span></span></li><li class="alt"><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class=""><span> EntityManager em = factory.createEntityManager(); </span></li><li class="alt"><span> em.getTransaction().begin(); </span></li><li
class=""><span> Person person = em.find(Person.<span class="keyword">class</span><span>, </span><span class="number">1</span><span>); </span></span></li><li class="alt"><span> person.setName(<span
class="string">"hmk"</span><span>); </span><span class="comment">//person为托管状态</span><span> </span></span></li><li class=""><span> em.getTransaction().commit(); </span></li><li class="alt"><span> em.close(); </span></li><li
class=""><span> factory.close(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> update2(){ </span></span></li><li class=""><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class="alt"><span> EntityManager em = factory.createEntityManager(); </span></li><li class=""><span> em.getTransaction().begin(); </span></li><li
class="alt"><span> Person person = em.find(Person.<span class="keyword">class</span><span>, </span><span class="number">1</span><span>); </span></span></li><li class=""><span> em.clear(); <span
class="comment">//把实体管理器中的所有实体变为脱管状态</span><span> </span></span></li><li class="alt"><span> person.setName(<span class="string">"hmk2"</span><span>); </span></span></li><li class=""><span> em.merge(person); <span
class="comment">//把脱管状态变为托管状态,merge可以自动选择insert or update 数据</span><span> </span></span></li><li class="alt"><span> em.getTransaction().commit(); </span></li><li class=""><span> em.close(); </span></li><li
class="alt"><span> factory.close(); </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> remove(){ </span></span></li><li class="alt"><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class=""><span> EntityManager em = factory.createEntityManager(); </span></li><li class="alt"><span> em.getTransaction().begin(); </span></li><li
class=""><span> Person person = em.find(Person.<span class="keyword">class</span><span>, </span><span class="number">1</span><span>); </span></span></li><li class="alt"><span> em.remove(person); <span
class="comment">//删除实体</span><span> </span></span></li><li class=""><span> em.getTransaction().commit(); </span></li><li class="alt"><span> em.close(); </span></li><li
class=""><span> factory.close(); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span
class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> find(){ </span></span></li><li class=""><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class="alt"><span> EntityManager em = factory.createEntityManager(); </span></li><li class=""><span> Person person = em.find(Person.<span
class="keyword">class</span><span>, </span><span class="number">2</span><span>); </span><span class="comment">//类似于hibernate的get方法,没找到数据时,返回null</span><span> </span></span></li><li class="alt"><span> System.out.println(person.getName()); </span></li><li
class=""><span> em.close(); </span></li><li class="alt"><span> factory.close(); </span></li><li class=""><span> } </span></li><li
class="alt"><span> <span class="annotation">@Test</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> find2(){ </span></span></li><li class=""><span> EntityManagerFactory factory = Persistence.createEntityManagerFactory(<span
class="string">"mysqlJPA"</span><span>); </span></span></li><li class="alt"><span> EntityManager em = factory.createEntityManager(); </span></li><li class=""><span> Person person = em.getReference(Person.<span
class="keyword">class</span><span>, </span><span class="number">2</span><span>); </span><span class="comment">//类似于hibernate的load方法,延迟加载.没相应数据时会出现异常</span><span> </span></span></li><li class="alt"><span> System.out.println(person.getName()); <span
class="comment">//真正调用时才查找数据</span><span> </span></span></li><li class=""><span> em.close(); </span></li><li class="alt"><span> factory.close(); </span></li><li
class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><textarea
cols="80" rows="15" name="code" class="java" style="display: none;">package junit.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
import com.hmk.bean.Person;
public class JpaTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void createTable(){
//可以验证生成表是否正确
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
factory.close();
}
@Test public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = new Person(); //person为new状态
person.setName("zhang san");
em.persist(person); //持久化实体
em.getTransaction().commit();
em.close();
factory.close();
}
//new 、托管、脱管、删除
@Test public void update(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
person.setName("hmk"); //person为托管状态
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void update2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.clear(); //把实体管理器中的所有实体变为脱管状态
person.setName("hmk2");
em.merge(person); //把脱管状态变为托管状态,merge可以自动选择insert or update 数据
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void remove(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.remove(person); //删除实体
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void find(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 2); //类似于hibernate的get方法,没找到数据时,返回null
System.out.println(person.getName());
em.close();
factory.close();
}
@Test public void find2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.getReference(Person.class, 2); //类似于hibernate的load方法,延迟加载.没相应数据时会出现异常
System.out.println(person.getName()); //真正调用时才查找数据
em.close();
factory.close();
}
}
</textarea> </p>
<p> </p>
<p> </p>
<p><span style="font-size: small;">d)、运行junit测试代码里的相应方法就行可以。</span></p>
<p> </p>
<p> </p>
</div>
<!-- Baidu Button BEGIN -->
<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1491988006064">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src
= 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->
<link rel="stylesheet" href="http://static.blog.csdn.net/css/blog_detail.css">
<!--172.16.140.11-->
<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=414442"></script>
<script type="text/javascript">
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->
<script type="text/javascript">
var fromjs = $("#fromjs");
if (fromjs.length > 0) {
$("#fromjs .markdown_views pre").addClass("prettyprint");
prettyPrint();
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
$('.pre-numbering li').css("color", "#999");
}
</script>
<div id="digg" articleid="6289151">
<dl id="btnDigg" class="digg digg_disable" onclick="btndigga();">
<dt>顶</dt>
<dd>14</dd>
</dl>
<dl id="btnBury" class="digg digg_disable" onclick="btnburya();">
<dt>踩</dt>
<dd>5</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<ul class="article_next_prev">
<li class="prev_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='/hmk2011/article/details/6283283';">上一篇</span><a href="/hmk2011/article/details/6283283" onclick="_gaq.push(['_trackEvent','function',
'onclick', 'blog_articles_shangyipian'])">spring AOP实现(Annotation方式/静态文件配置方式)</a></li>
</ul>
<div style="clear:both; height:10px;"></div>
<div class="similar_article" style="">
<h4>我的同类文章</h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
<label class="similar_cur">
<span style="cursor:pointer" onclick="GetCategoryArticles('793467','hmk2011','foot','6289151');">j2se<em>(5)</em></span>
</label>
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
<a href="http://blog.csdn.net" style="display:none">http://blog.csdn.net</a>
<ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/hmk2011/article/details/6259572" id="foot_aritcle_6259572undefined24386708387433087" target="_blank" title="CGLIB入门编程例子">CGLIB入门编程例子</a><span>2011-03-18</span><label><i>阅读</i><b>1726</b></label></li>
<li><em>•</em><a href="http://blog.csdn.net/hmk2011/article/details/6232494" id="foot_aritcle_6232494undefined6730189866053025" target="_blank" title="java设计模式-代理模式">java设计模式-代理模式</a><span>2011-03-08</span><label><i>阅读</i><b>354</b></label></li> <li><em>•</em><a
href="http://blog.csdn.net/hmk2011/article/details/6230843" id="foot_aritcle_6230843undefined9501011803703079" target="_blank" title="正确使用 Volatile 变量">正确使用 Volatile 变量</a><span>2011-03-08</span><label><i>阅读</i><b>350</b></label></li> </ul>
<ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/hmk2011/article/details/6249281" id="foot_aritcle_6249281undefined5696538307376082" target="_blank" title="Java设计模式-单例模式">Java设计模式-单例模式</a><span>2011-03-14</span><label><i>阅读</i><b>484</b></label></li>
<li><em>•</em><a href="http://blog.csdn.net/hmk2011/article/details/6231275" id="foot_aritcle_6231275undefined008780324893189473" target="_blank" title="Java线程:并发协作-生产者消费者模型">Java线程:并发协作-生产者消费者模型</a><span>2011-03-08</span><label><i>阅读</i><b>419</b></label></li>
</ul>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
GetCategoryArticles('793467', 'hmk2011','foot','6289151');
});
</script>
</div>
相关文章推荐
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本) --- 会伴随 配置文件:persistence.xml
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本) .
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本) 转
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- 【Java基础】JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本) 及单元测试
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)
- JPA入门例子(采用JPA的hibernate实现版本)