日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JPA基础(八):分析JPA与持久化实现产品对接的源代码

發(fā)布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JPA基础(八):分析JPA与持久化实现产品对接的源代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用jadnt158工具將ejb3-persistence.jar\javax\persistence.class進行反編譯得到源碼:

1 // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
2 // Jad home page: http://www.kpdus.com/jad.html
3 // Decompiler options: packimports(3)
4 // Source File Name: Persistence.java
5
6 package javax.persistence;
7
8 import java.io.*;
9 import java.net.URL;
10 import java.util.*;
11 import java.util.regex.Matcher;
12 import java.util.regex.Pattern;
13 import javax.persistence.spi.PersistenceProvider;
14
15 // Referenced classes of package javax.persistence:
16 // PersistenceException, EntityManagerFactory
17
18 public class Persistence
19 {
20
21 public Persistence()
22 {
23 }
24
25 public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName)
26 {
27 return createEntityManagerFactory(persistenceUnitName, null);
28 }
29
30 public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties)
31 {
32 EntityManagerFactory emf = null;
33 if(providers.size() == 0)
34 findAllProviders();
35 Iterator i$ = providers.iterator();
36 do
37 {
38 if(!i$.hasNext())
39 break;
40 PersistenceProvider provider = (PersistenceProvider)i$.next();
41 emf = provider.createEntityManagerFactory(persistenceUnitName, properties);
42 } while(emf == null);
43 if(emf == null)
44 throw new PersistenceException((new StringBuilder()).append("No Persistence provider for EntityManager named ").append(persistenceUnitName).toString());
45 else
46 return emf;
47 }
48
49 private static void findAllProviders()
50 {
51 ClassLoader loader;
52 Enumeration resources;
53 Set names;
54 loader = Thread.currentThread().getContextClassLoader();
55 resources = loader.getResources((new StringBuilder()).append("META-INF/services/").append(javax/persistence/spi/PersistenceProvider.getName()).toString());
56 names = new HashSet();
57 _L2:
58 InputStream is;
59 if(!resources.hasMoreElements())
60 break; /* Loop/switch isn't completed */
61 URL url = (URL)resources.nextElement();
62 is = url.openStream();
63 names.addAll(providerNamesFromReader(new BufferedReader(new InputStreamReader(is))));
64 is.close();
65 if(true) goto _L2; else goto _L1
66 Exception exception;
67 exception;
68 is.close();
69 throw exception;
70 _L1:
71 Class providerClass;
72 for(Iterator i$ = names.iterator(); i$.hasNext(); providers.add((PersistenceProvider)providerClass.newInstance()))
73 {
74 String s = (String)i$.next();
75 providerClass = loader.loadClass(s);
76 }
77
78 break MISSING_BLOCK_LABEL_214;
79 IOException e;
80 e;
81 throw new PersistenceException(e);
82 e;
83 throw new PersistenceException(e);
84 e;
85 throw new PersistenceException(e);
86 e;
87 throw new PersistenceException(e);
88 }
89
90 private static Set providerNamesFromReader(BufferedReader reader)
91 throws IOException
92 {
93 Set names = new HashSet();
94 do
95 {
96 String line;
97 if((line = reader.readLine()) == null)
98 break;
99 line = line.trim();
100 Matcher m = nonCommentPattern.matcher(line);
101 if(m.find())
102 names.add(m.group().trim());
103 } while(true);
104 return names;
105 }
106
107 public static final String PERSISTENCE_PROVIDER = "javax.persistence.spi.PeristenceProvider";
108 protected static final Set providers = new HashSet();
109 private static final Pattern nonCommentPattern = Pattern.compile("^([^#]+)");
110
111 }

在如下圖所示中:

打開javax.persistence.spi.PersistenceProvider,內(nèi)容為:org.hibernate.ejb.HibernatePersistence

程序會在類路徑地下尋找到這個文件,并讀取這個配置文件里面指定的可持久化驅(qū)動。Hibernate提供的可持久化驅(qū)動就是org.hibernate.ejb.HibernatePersistence這個類,這個類是Hibernate的入口類,類似JDBC里面的驅(qū)動類。當(dāng)然,不同的可持久化產(chǎn)品的入口類是不同的,調(diào)用JPA應(yīng)用,它能使用Hibernate,是因為有這樣一個驅(qū)動類,它起到了一個橋梁的作用,過渡到Hibernate的產(chǎn)品上,這就是調(diào)用EntityManagerFactory factory =Persistence.createEntityManagerFactory("sample");


創(chuàng)建實體管理器方法的一些執(zhí)行細(xì)節(jié)
factory 是由Hibernate的可持久化驅(qū)動類創(chuàng)建出來的,如果觀察Hibernate的實現(xiàn)類的話,會發(fā)現(xiàn)實際上EntityManagerFactory 是對SessionFactory這個類進行了一層封裝。包括EntityManager類也是對Session對象進行了一層封裝而已。

轉(zhuǎn)載于:https://www.cnblogs.com/lich/archive/2011/11/30/2269741.html

總結(jié)

以上是生活随笔為你收集整理的JPA基础(八):分析JPA与持久化实现产品对接的源代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。