什么是JPA蔬捷?Java Persistence API簡介

作為規(guī)范,Java Persistence API關(guān)注持久性妥粟,它將Java對象的創(chuàng)建過程和具體的創(chuàng)建形式解耦勾给。并非所有Java對象都需要持久化播急,但大多數(shù)應(yīng)用程序都會保留關(guān)鍵業(yè)務(wù)對象桩警。JPA規(guī)范允許您定義應(yīng)該保留哪些對象握截,以及如何在Java應(yīng)用程序中保留這些對象川蒙。

JPA本身不是一個工具或框架; 相反,它定義了一組可以由任何工具或框架實現(xiàn)的概念昼牛。雖然JPA的對象關(guān)系映射(ORM)模型最初基于Hibernate术瓮,但它已經(jīng)發(fā)展了。同樣辜伟,雖然JPA最初打算用于關(guān)系/ SQL數(shù)據(jù)庫,但是一些JPA實現(xiàn)已經(jīng)擴展用于NoSQL數(shù)據(jù)存儲脊另。支持JPA和NoSQL的流行框架是EclipseLink导狡,它是JPA 2.2的參考實現(xiàn)。

JPA和Hibernate

由于它們交織在一起的歷史偎痛,Hibernate和JPA經(jīng)澈蹬酰混為一談。但是踩麦,與Java Servlet規(guī)范一樣枚赡,JPA產(chǎn)生了許多兼容的工具和框架; Hibernate只是其中之一。

Hibernate由Gavin King開發(fā)贫橙,于2002年初發(fā)布,是一個用于Java的ORM庫。King開發(fā)了Hibernate作為持久化實體bean的替代品。該框架非常受歡迎,當(dāng)時非常需要,它的許多想法都在第一個JPA規(guī)范中被采用和編纂。

今天,Hibernate ORM是最成熟的JPA實現(xiàn)之一,并且仍然是Java中ORM的流行選項。Hibernate ORM 5.3.8(撰寫本文時的當(dāng)前版本)實現(xiàn)了JPA 2.2。此外蚯舱,Hibernate的工具系列已經(jīng)擴展到包括Hibernate Search,Hibernate Validator和Hibernate OGM等流行工具阳藻,后者支持NoSQL的域模型持久性。

什么是Java ORM夹厌?

雖然它們的執(zhí)行不同或南,但每個JPA實現(xiàn)都提供某種ORM層。為了理解JPA和JPA兼容的工具,您需要掌握ORM。

對象關(guān)系映射是一項任務(wù) - 開發(fā)人員有充分的理由避免手動執(zhí)行。像Hibernate ORM或EclipseLink這樣的框架將該任務(wù)編碼為庫或框架狂巢,即ORM層斩个。作為應(yīng)用程序體系結(jié)構(gòu)的一部分叁温,ORM層負(fù)責(zé)管理軟件對象的轉(zhuǎn)換跟束,以便與關(guān)系數(shù)據(jù)庫中的表和列進行交互温学。在Java中揽祥,ORM層轉(zhuǎn)換Java類和對象站绪,以便可以在關(guān)系數(shù)據(jù)庫中存儲和管理它們敏沉。

默認(rèn)情況下辖众,持久化對象的名稱將成為表的名稱蚕键,字段將成為列频丘。設(shè)置表后怔毛,每個表行對應(yīng)于應(yīng)用程序中的對象日麸。對象映射是可配置的蛤高,但默認(rèn)值往往效果很好。

圖1說明了JPA和ORM層在應(yīng)用程序開發(fā)中的作用。

圖1

配置Java ORM層

設(shè)置新項目以使用JPA時,需要配置數(shù)據(jù)存儲區(qū)和JPA提供程序距误。您將配置數(shù)據(jù)存儲連接器以連接到您選擇的數(shù)據(jù)庫(SQL或NoSQL)寺擂。您還將包含和配置JPA提供程序,它是一個框架吝梅,如Hibernate或EclipseLink国旷。雖然您可以手動配置JPA筛欢,但許多開發(fā)人員選擇使用Spring的開箱即用支持浸锨。有關(guān)手動和基于Spring的JPA安裝和設(shè)置的演示,請參閱下面的“ JPA安裝和設(shè)置 ”版姑。

Java數(shù)據(jù)對象

Java Data Objects是一個標(biāo)準(zhǔn)化的持久性框架柱搜,它與JPA的不同之處主要在于支持對象中的持久性邏輯,以及它長期以來對使用非關(guān)系數(shù)據(jù)存儲的支持剥险。JPA和JDO足夠相似聪蘸,JDO提供者也經(jīng)常支持JPA。請參閱Apache JDO項目表制,以了解有關(guān)JDO與JPA和JDBC等其他持久性標(biāo)準(zhǔn)相關(guān)的更多信息健爬。

Java中的數(shù)據(jù)持久性

從編程的角度來看,ORM層是一個適配器層:它使對象圖的語言適應(yīng)SQL和關(guān)系表的語言么介。ORM層允許面向?qū)ο蟮拈_發(fā)人員構(gòu)建持久保存數(shù)據(jù)的軟件娜遵,而無需離開面向?qū)ο蟮姆独?/p>

使用JPA時,可以創(chuàng)建從數(shù)據(jù)存儲區(qū)到應(yīng)用程序的數(shù)據(jù)模型對象的映射夭拌。您可以定義對象和數(shù)據(jù)庫之間的映射魔熏,而不是定義對象的保存和檢索方式,然后調(diào)用JPA來保存它們鸽扁。如果您正在使用關(guān)系數(shù)據(jù)庫蒜绽,那么應(yīng)用程序代碼和數(shù)據(jù)庫之間的大部分實際連接將由JDBC(Java數(shù)據(jù)庫連接API)處理。

作為規(guī)范桶现,JPA提供元數(shù)據(jù)注釋躲雅,您可以使用它來定義對象和數(shù)據(jù)庫之間的映射。每個JPA實現(xiàn)都為JPA注釋提供了自己的引擎骡和。JPA規(guī)范還提供了PersistanceManager或者EntityManager相赁,它們是與JPA系統(tǒng)聯(lián)系的關(guān)鍵點(其中您的業(yè)務(wù)邏輯代碼告訴系統(tǒng)如何處理映射對象)。

為了使所有這些更具體慰于,請考慮清單1钮科,這是一個用于為音樂家建模的簡單數(shù)據(jù)類。

清單1. Java中的一個簡單數(shù)據(jù)類

public class Musician {
    private long id;
    private String name;
    private Instrument mainInstrument;
    private ArrayList performances = new ArrayList<Performance>();
    public Musician( long id, String name){
        /* constructor setters... */
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setMainInstrument(Instrument instr){
        this.instrument = instr;
    }
    public Instrument getMainInstrument(){
        return this.instrument;
    }
    // ...Other getters and setters...
}

清單1中的Musician類用于保存數(shù)據(jù)婆赠。它可以包含原始數(shù)據(jù)绵脯,例如名稱字段。它還可以與其他類(如mainInstrumentperformances)保持關(guān)系。

Musician存在的原因是包含數(shù)據(jù)蛆挫。這種類有時稱為DTO或數(shù)據(jù)傳輸對象赃承。DTO是軟件開發(fā)的常見功能。雖然它們包含多種數(shù)據(jù)悴侵,但它們不包含任何業(yè)務(wù)邏輯瞧剖。持久化數(shù)據(jù)對象是軟件開發(fā)中普遍存在的挑戰(zhàn)。

JDBC的數(shù)據(jù)持久性

Musician類的實例保存到關(guān)系數(shù)據(jù)庫的一種方法是使用JDBC庫可免。JDBC是一個抽象層抓于,它允許應(yīng)用程序發(fā)出SQL命令而無需考慮底層數(shù)據(jù)庫實現(xiàn)。

清單2顯示了如何使用JDBC 來持久化Musician類巴元。

清單2.插入記錄的JDBC

Musician georgeHarrison = new Musician(0, "George Harrison");

    String myDriver = "org.gjt.mm.mysql.Driver";
      String myUrl = "jdbc:mysql://localhost/test";
      Class.forName(myDriver);
      Connection conn = DriverManager.getConnection(myUrl, "root", "");

      String query = " insert into users (id, name) values (?, ?)";
      PreparedStatement preparedStmt = conn.prepareStatement(query);
      preparedStmt.setInt    (1, 0);
      preparedStmt.setString (2, "George Harrison");
      preparedStmt.setString (2, "Rubble");

      preparedStmt.execute();
      conn.close();

// Error handling removed for brevity

清單2中的代碼是相當(dāng)自我記錄的毡咏。該georgeHarrison對象可以來自任何地方(前端提交,外部服務(wù)等)逮刨,并設(shè)置其ID和name字段呕缭。然后,對象上的字段用于提供SQL insert語句的值修己。(PreparedStatement該類是JDBC的一部分恢总,提供了一種將值安全地應(yīng)用于SQL查詢的方法。)

雖然JDBC允許手動配置附帶的控件睬愤,但與JPA相比片仿,它很麻煩。要修改數(shù)據(jù)庫尤辱,首先需要創(chuàng)建一個SQL查詢砂豌,該查詢從Java對象映射到關(guān)系數(shù)據(jù)庫中的表。然后光督,只要對象簽名發(fā)生更改阳距,就必須修改SQL。使用JDBC结借,維護SQL本身就成了一項任務(wù)筐摘。

JPA的數(shù)據(jù)持久性

現(xiàn)在考慮清單3,我們使用JPA 持久化Musician類船老。

清單3.使用JPA保留George Harrison

Musician georgeHarrison = new Musician(0, "George Harrison");
musicianManager.save(georgeHarrison);

清單3用一行session.save()替換了清單2中的手動SQL 咖熟,它指示JPA持久保存該對象。從那時起柳畔,SQL轉(zhuǎn)換由框架處理馍管,因此您永遠(yuǎn)不必離開面向?qū)ο蟮姆独?/p>

JPA中的元數(shù)據(jù)注釋

清單3中的魔力是配置的結(jié)果,該配置是使用JPA的注釋創(chuàng)建的薪韩。開發(fā)人員使用注釋來告知JPA應(yīng)該保留哪些對象咽斧,以及如何保留它們堪置。

清單4顯示了具有單個JPA注釋的Musician類。

清單4. JPA的@Entity注釋

@Entity
public class Musician {
    // ..class body
}

持久對象有時稱為實體张惹。附加@Entity到類,Musician告知JPA應(yīng)該保留此類及其對象岭洲。

配置JPA

與大多數(shù)現(xiàn)代框架一樣宛逗,JPA 遵循約定編碼(也稱為約定優(yōu)于配置),其中框架提供基于行業(yè)最佳實踐的默認(rèn)配置盾剩。作為一個示例雷激,名為Musician的類將默認(rèn)映射到名為Musician的數(shù)據(jù)庫表。

傳統(tǒng)配置是節(jié)省時間的告私,并且在許多情況下它運行良好屎暇。也可以自定義JPA配置。例如驻粟,您可以使用JPA的@Table注釋來指定應(yīng)該存儲Musician類的表根悼。

清單5. JPA的@Table注釋

@Entity
@Table(name="musician")
public class Musician {
    // ..class body
}

清單5告訴JPA將實體(Musician類)持久化到musician表中。

主鍵

在JPA中蜀撑,主鍵是用于唯一標(biāo)識數(shù)據(jù)庫中每個對象的字段挤巡。主鍵可用于引用對象并將對象與其他實體相關(guān)聯(lián)。每當(dāng)您在表中存儲對象時酷麦,您還將指定要用作其主鍵的字段矿卑。

在清單6中,我們告訴JPA要使用哪個字段作為Musician主鍵沃饶。

清單6.指定主鍵

@Entity
public class Musician {
    @Id
       private long id;

在這種情況下母廷,我們使用JPA的@Id注釋將id字段指定為Musician主鍵。默認(rèn)情況下糊肤,此配置假定主鍵將由數(shù)據(jù)庫設(shè)置 - 例如琴昆,當(dāng)字段設(shè)置為在表上自動遞增時。

JPA支持生成對象主鍵的其他策略轩褐。它還有用于更改單個字段名稱的注釋椎咧。通常,JPA足夠靈活把介,可以適應(yīng)您可能需要的任何持久性映射勤讽。

CRUD操作

將類映射到數(shù)據(jù)庫表并建立其主鍵后,即可擁有在數(shù)據(jù)庫中創(chuàng)建拗踢,檢索脚牍,刪除和更新該類所需的一切。調(diào)用session.save()將創(chuàng)建或更新指定的類巢墅,具體取決于主鍵字段是否為null或是否適用于現(xiàn)有實體诸狭。調(diào)用entityManager.remove()將刪除指定的類券膀。

JPA中的實體關(guān)系

簡單地使用原始字段持久化對象只是方程式的一半。JPA還具有管理彼此相關(guān)實體的能力驯遇。在表和對象中都有四種實體關(guān)系:

  1. 一到多
  2. 許多到一
  3. 許多一對多
  4. 一比一

每種類型的關(guān)系描述了實體與其他實體的關(guān)系芹彬。例如,Musician實體可以與由諸如ListSet的集合表示的實體具有一對多的關(guān)系叉庐。

如果Musician包含一個Band字段舒帮,這些實體之間的關(guān)系可以是多對一的,這意味著在單個Band類上有Musician集合 陡叠。(假設(shè)每個音樂家只在一個樂隊中演奏玩郊。)

如果Musician包含BandMates字段,則可以表示與其他Musician實體的多對多關(guān)系枉阵。

最后译红,Musician可能與Quote實體有一對一的關(guān)系,用于表示一個著名的引語:Quote famousQuote = new Quote()兴溜。

定義關(guān)系類型

JPA為每種關(guān)系映射類型提供注解侦厚。清單7顯示了如何注解MusicianPerformances之間的一對多關(guān)系。

清單7.注釋一對多關(guān)系

public class Musician {

  @OneToMany
  @JoinColumn(name="musicianId")
  private List<Performance> performances = new ArrayList<Performance>();
  //...
}

需要注意的一點是@JoinColumn告訴JPA Performance表上的哪一列將映射到Musician實體昵慌。每個performance都將與單個Musician關(guān)聯(lián)假夺,該列由此列跟蹤。當(dāng)JPA將一個 Musician或一個Performance 加載到數(shù)據(jù)庫中時斋攀,它將使用此信息重新構(gòu)建對象圖已卷。

在JPA中獲取策略

除了知道在數(shù)據(jù)庫中放置相關(guān)實體??的位置之外,JPA還需要知道如何加載它們淳蔼。獲取策略告訴JPA如何加載相關(guān)實體侧蘸。加載和保存對象時,JPA框架必須能夠微調(diào)對象圖的處理方式鹉梨。例如讳癌,如果Musician類有一個bandMate字段(如清單7所示),加載george可能導(dǎo)致整個Musician表從數(shù)據(jù)庫加載存皂!

我們需要的是定義相關(guān)實體的延遲加載的能力- 當(dāng)然晌坤,認(rèn)識到JPA中的關(guān)系可能是eager或lazy的。您可以使用注釋來自定義提取策略旦袋,但JPA的默認(rèn)配置通持璨ぃ可以直接使用,無需更改:

  1. 一對多:lazy
  2. 多對一:eager
  3. 多對多:lazy
  4. 一對一:eager

JPA安裝和設(shè)置

最后疤孕,我們將簡要介紹如何為Java應(yīng)用程序安裝和設(shè)置JPA商乎。在本演示中,我將使用EclipseLink祭阀,即JPA參考實現(xiàn)鹉戚。

安裝JPA的常用方法是在項目中包含 JPA提供程序鲜戒。清單8顯示了如何將EclipseLink作為Maven pom.xml文件中的依賴項包含在內(nèi)。

清單8.將EclipseLink包含為Maven依賴項

    org.eclipse.persistence
    eclipselink
    2.5.0-RC1

您還需要包含數(shù)據(jù)庫的驅(qū)動程序抹凳,如清單9所示遏餐。

清單9. MySql連接器的Maven依賴關(guān)系

mysql
            mysql-connector-java
            5.1.32

接下來,您需要告訴系統(tǒng)您的數(shù)據(jù)庫和提供程序却桶。這在persistence.xml文件中完成境输,如清單10所示。

清單10. Persistence.xml

http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="MyUnit" transaction-type="RESOURCE_LOCAL">
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/foo_bar"/>
            <property name="javax.persistence.jdbc.user" value=""/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

還有其他方法可以向系統(tǒng)提供此信息颖系,包括以編程方式。我建議使用該persistence.xml文件辩越,因為以這種方式存儲依賴項使得在不修改代碼的情況下更新應(yīng)用程序非常容易嘁扼。

JPA的Spring配置

使用Spring將極大地簡化JPA與應(yīng)用程序的集成。例如黔攒,將@SpringBootApplication注釋放在應(yīng)用程序頭中會指示Spring 根據(jù)您指定的配置自動掃描類并根據(jù)需要注入EntityManager趁啸。

如果您希望Spring為您的應(yīng)用程序提供JPA支持,清單11顯示了要包含的依賴項督惰。

清單11.在Maven中添加Spring JPA支持

org.springframework.boot
    spring-boot-starter
    2.1.3.RELEASE
    org.springframework.boot
    spring-boot-starter-data-jpa
    2.1.3.RELEASE

結(jié)論

處理數(shù)據(jù)庫的每個應(yīng)用程序都應(yīng)該定義一個應(yīng)用程序?qū)硬桓担湮ㄒ荒康氖歉綦x持久性代碼。正如您在本文中看到的赏胚,Java Persistence API引入了一系列功能并支持Java對象持久性访娶。簡單的應(yīng)用程序可能不需要JPA的所有功能,在某些情況下觉阅,配置框架的開銷可能不值得崖疤。然而,隨著應(yīng)用程序的增長典勇,JPA的結(jié)構(gòu)和封裝確實能夠保持不變劫哼。使用JPA可以簡化目標(biāo)代碼,并提供用于訪問Java應(yīng)用程序中的數(shù)據(jù)的傳統(tǒng)框架割笙。

讀者福利:

分享免費學(xué)習(xí)資料

針對于Java程序員权烧,我這邊準(zhǔn)備免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)伤溉、高性能及分布式般码、Jvm性能調(diào)優(yōu)、MyBatis谈火,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)

為什么某些人會一直比你優(yōu)秀侈询,是因為他本身就很優(yōu)秀還一直在持續(xù)努力變得更優(yōu)秀,而你是不是還在滿足于現(xiàn)狀內(nèi)心在竊喜糯耍!希望讀到這的您能點個小贊和關(guān)注下我扔字,以后還會更新技術(shù)干貨囊嘉,謝謝您的支持!

資料領(lǐng)取方式:加入Java技術(shù)交流群963944895革为,點擊加入群聊扭粱,私信管理員即可免費領(lǐng)取

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市震檩,隨后出現(xiàn)的幾起案子琢蛤,更是在濱河造成了極大的恐慌,老刑警劉巖抛虏,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件博其,死亡現(xiàn)場離奇詭異,居然都是意外死亡迂猴,警方通過查閱死者的電腦和手機慕淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沸毁,“玉大人峰髓,你說我怎么就攤上這事∠⒊撸” “怎么了携兵?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搂誉。 經(jīng)常有香客問我徐紧,道長,這世上最難降的妖魔是什么勒葱? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任浪汪,我火速辦了婚禮,結(jié)果婚禮上凛虽,老公的妹妹穿的比我還像新娘死遭。我一直安慰自己,他們只是感情好凯旋,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布呀潭。 她就那樣靜靜地躺著,像睡著了一般至非。 火紅的嫁衣襯著肌膚如雪钠署。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天荒椭,我揣著相機與錄音谐鼎,去河邊找鬼。 笑死趣惠,一個胖子當(dāng)著我的面吹牛狸棍,可吹牛的內(nèi)容都是我干的身害。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼草戈,長吁一口氣:“原來是場噩夢啊……” “哼塌鸯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唐片,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤丙猬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后费韭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茧球,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年星持,在試婚紗的時候發(fā)現(xiàn)自己被綠了袜腥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡钉汗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲤屡,到底是詐尸還是另有隱情损痰,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布酒来,位于F島的核電站卢未,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堰汉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望解幽。 院中可真熱鬧鸳址,春花似錦、人聲如沸就乓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽生蚁。三九已至噩翠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邦投,已是汗流浹背伤锚。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留志衣,地道東北人屯援。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓猛们,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玄呛。 傳聞我的和親對象是個殘疾皇子阅懦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 作為規(guī)范耳胎,Java Persistence API關(guān)注持久性,它將Java對象的創(chuàng)建過程和具體的創(chuàng)建形式解耦惕它。并非...
    Java架構(gòu)學(xué)習(xí)者閱讀 3,557評論 0 1
  • 在一個方法內(nèi)部定義的變量都存儲在棧中怕午,當(dāng)這個函數(shù)運行結(jié)束后,其對應(yīng)的棧就會被回收淹魄,此時郁惜,在其方法體中定義的變量將不...
    Y了個J閱讀 4,413評論 1 14
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,795評論 0 11
  • 作者:鐘昕靈,叩丁狼教育高級講師甲锡。原創(chuàng)文章兆蕉,轉(zhuǎn)載請注明出處。 JPA簡介 JPA是Java Persistence...
    叩丁狼教育閱讀 4,092評論 1 5
  • “綠蓑江上秋聞笛,紅袖樓頭夜倚欄”慕雅女雅集苦吟詩一回中呆香菱三易其稿缸废,精血誠聚包蓝,終夢中得詩。 《紅樓夢...
    渙柒閱讀 916評論 2 3