锘??xml version="1.0" encoding="utf-8" standalone="yes"?> JPA錛圝ava Persistence API錛孞ava鎸佷箙鍖朅PI錛夛紝瀹氫箟浜嗗璞?鍏崇郴鏄犲皠錛圤RM錛変互鍙婂疄浣撳璞℃寔涔呭寲鐨勬爣鍑嗘帴鍙c?/p> JPA鏄疛SR-220錛圗JB3.0錛夎鑼冪殑涓閮ㄥ垎錛屽湪JSR-220涓瀹氬疄浣撳璞★紙EntityBean錛夌敱JPA榪涜鏀寔銆?/p> 鎵浠PA涓嶅眬闄愪簬EJB3.0錛岃屾槸浣滀負POJO鎸佷箙鍖栫殑鏍囧噯瑙勮寖錛屽彲浠ヨ劚紱誨鍣ㄧ嫭绔嬭繍琛岋紝寮鍙戝拰嫻嬭瘯鏇村姞鏂逛究銆?/p> JPA鍦ㄥ簲鐢ㄤ腑鐨勪綅緗涓嬪浘鎵紺猴細 JPA緇存姢涓涓狿ersistence Context錛堟寔涔呭寲涓婁笅鏂囷級錛屽湪鎸佷箙鍖栦笂涓嬫枃涓淮鎶ゅ疄浣撶殑鐢熷懡鍛ㄦ湡銆備富瑕佸寘鍚笁涓柟闈㈢殑鍐呭錛?/p> JPA鐨勪富瑕丄PI閮藉畾涔夊湪javax.persistence鍖呬腑銆傚鏋滀綘鐔熸倝Hibernate錛屽彲浠ュ緢瀹規槗鍋氬嚭瀵瑰簲錛?/p> 瀹炰綋鐢熷懡鍛ㄦ湡鏄疛PA涓潪甯擱噸瑕佺殑姒傚康錛屾弿榪頒簡瀹炰綋瀵硅薄浠庡垱寤哄埌鍙楁帶銆佷粠鍒犻櫎鍒版父紱葷殑鐘舵佸彉鎹€傚瀹炰綋鐨勬搷浣滀富瑕佸氨鏄敼鍙樺疄浣撶殑鐘舵併?/p> JPA涓疄浣撶殑鐢熷懡鍛ㄦ湡濡備笅鍥撅細 EntityManager鎻愪緵涓緋誨垪鐨勬柟娉曠鐞嗗疄浣撳璞$殑鐢熷懡鍛ㄦ湡錛屽寘鎷細 濡傛灉浣跨敤浜嗕簨鍔$鐞嗭紝鍒欎簨鍔$殑commit/rollback涔熶細鏀瑰彉瀹炰綋鐨勭姸鎬併?/p> ID瀵瑰簲鏁版嵁搴撹〃鐨勪富閿紝鏄繚璇佸敮涓鎬х殑閲嶈灞炴с侸PA鎻愪緵浜嗕互涓嬪嚑縐岻D鐢熸垚絳栫暐 @TableGenerator( name="myGenerator", table="GENERATORTABLE", pkColumnName = "ENTITYNAME", pkColumnValue="MyEntity", valueColumnName = "PKVALUE", allocationSize=1 ) @GeneratedValue(strategy = GenerationType.TABLE,generator="myGenerator") JPA瀹氫箟浜唎ne-to-one銆乷ne-to-many銆乵any-to-one銆乵any-to-many 4縐嶅叧緋匯?/p> 瀵逛簬鏁版嵁搴撴潵璇達紝閫氬父鍦ㄤ竴涓〃涓褰曞鍙︿竴涓〃鐨勫閿叧鑱旓紱瀵瑰簲鍒板疄浣撳璞★紝鎸佹湁鍏寵仈鏁版嵁鐨勪竴鏂圭О涓簅wning-side錛屽彟涓鏂圭О涓篿nverse-side銆?/p> 涓轟簡緙栫▼鐨勬柟渚匡紝鎴戜滑緇忓父浼氬笇鏈涘湪inverse-side涔熻兘寮曠敤鍒皁wning-side鐨勫璞★紝姝ゆ椂灝辨瀯寤轟簡鍙屽悜鍏寵仈鍏崇郴銆?鍦ㄥ弻鍚戝叧鑱斾腑錛岄渶瑕佸湪inverse-side瀹氫箟mappedBy灞炴э紝浠ユ寚鏄庡湪owning-side鏄摢涓涓睘鎬ф寔鏈夌殑鍏寵仈鏁版嵁銆?/p> 瀵瑰叧鑱斿叧緋繪槧灝勭殑瑕佺偣濡備笅錛?/p> 鍏朵腑 many-to-many鍏崇郴鐨刼wning-side鍙互浣跨敤@JoinTable澹版槑鑷畾涔夊叧鑱旇〃錛屾瘮濡侭ook鍜孉uthor涔嬮棿鐨勫叧鑱旇〃錛?/p> @JoinTable(name = "BOOKAUTHOR", joinColumns = { @JoinColumn(name = "BOOKID", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "AUTHORID", referencedColumnName = "id") }) 鍏寵仈鍏崇郴榪樺彲浠ュ畾鍒跺歡榪熷姞杞藉拰綰ц仈鎿嶄綔鐨勮涓猴紙owning-side鍜宨nverse-side鍙互鍒嗗埆璁劇疆錛夛細 閫氳繃璁劇疆fetch=FetchType.LAZY 鎴?fetch=FetchType.EAGER鏉ュ喅瀹氬叧鑱斿璞℃槸寤惰繜鍔犺澆鎴栫珛鍗沖姞杞姐?/p> 閫氳繃璁劇疆cascade={options}鍙互璁劇疆綰ц仈鎿嶄綔鐨勮涓猴紝鍏朵腑options鍙互鏄互涓嬬粍鍚堬細 JPA閫氳繃鍦ㄧ埗綾誨鍔燖Inheritance(strategy=InheritanceType.xxx)鏉ュ0鏄庣戶鎵垮叧緋匯侫鏀寔3縐嶇戶鎵跨瓥鐣ワ細 鍏朵腑1鍜?鑳藉鏀寔澶氭侊紝浣嗘槸1闇瑕佸厑璁稿瓧孌典負NULL錛?闇瑕佸涓狫OIN鍏崇郴錛?鏈閫傚悎鍏崇郴鏁版嵁搴擄紝瀵瑰鎬佹敮鎸佷笉濂姐傚叿浣撳簲鐢ㄦ椂鏍規嵁闇瑕佸彇鑸嶃?/p> 閫氳繃鍦ㄥ疄浣撶殑鏂規硶涓婃爣娉ˊPrePersist錛孈PostPersist絳夊0鏄庡嵆鍙湪浜嬩歡鍙戠敓鏃惰Е鍙戣繖浜涙柟娉曘?/p> JPA鎻愪緵涓ょ鏌ヨ鏂瑰紡錛屼竴縐嶆槸鏍規嵁涓婚敭鏌ヨ錛屼嬌鐢‥ntityManager鐨刦ind鏂規硶錛?/p> T find(Class entityClass, Object primaryKey) 鍙︿竴縐嶅氨鏄嬌鐢↗PQL鏌ヨ璇█銆侸PQL鏄畬鍏ㄩ潰鍚戝璞$殑錛屽叿澶囩戶鎵褲佸鎬佸拰鍏寵仈絳夌壒鎬э紝鍜宧ibernate HQL寰堢浉浼箋?/p> 浣跨敤EntityManager鐨刢reateQuery鏂規硶錛?/p> Query createQuery(String qlString) 鍙互鍦↗PQL璇彞涓嬌鐢ㄥ弬鏁般侸PQL鏀寔鍛藉悕鍙傛暟鍜屼綅緗弬鏁頒袱縐嶅弬鏁幫紝浣嗘槸鍦ㄤ竴鏉PQL璇彞涓墍鏈夌殑鍙傛暟鍙兘浣跨敤鍚屼竴縐嶇被鍨嬨?/p> 涓句緥濡備笅錛?/p> Query query = em.createQuery("select p from Person p where p.personid=:Id"); query.setParameter("Id",new Integer(1)); Query query = em.createQuery("select p from Person p where p.personid=?1"); query.setParameter(1,new Integer(1)); 濡傛灉鏌愪釜JPQL璇彞闇瑕佸湪澶氫釜鍦版柟浣跨敤錛岃繕鍙互浣跨敤@NamedQuery 鎴栬?@NamedQueries鍦ㄥ疄浣撳璞′笂棰勫畾涔夊懡鍚嶆煡璇€?/p> 鍦ㄩ渶瑕佽皟鐢ㄧ殑鍦版柟鍙寮曠敤璇ユ煡璇㈢殑鍚嶅瓧鍗沖彲銆?/p> 渚嬪錛?/p> @NamedQuery(name="getPerson", query= "FROM Person WHERE personid=?1") @NamedQueries({ @NamedQuery(name="getPerson1", query= "FROM Person WHERE personid=?1"), @NamedQuery(name="getPersonList", query= "FROM Person WHERE age>?1") }) Query query = em.createNamedQuery("getPerson"); JPQL涔熸敮鎸佹帓搴忥紝綾諱技浜嶴QL涓殑璇硶銆備緥濡傦細 Query query = em.createQuery("select p from Person p order by p.age, p.birthday desc"); JPQL鏀寔AVG銆丼UM銆丆OUNT銆丮AX銆丮IN浜斾釜鑱氬悎鍑芥暟銆備緥濡傦細 Query query = em.createQuery("select max(p.age) from Person p"); Object result = query.getSingleResult(); String maxAge = result.toString(); JPQL涓嶄粎鐢ㄤ簬鏌ヨ錛岃繕鍙互鐢ㄤ簬鎵歸噺鏇存柊鍜屽垹闄ゃ?/p> 濡傦細 Query query = em.createQuery("update Order as o set o.amount=o.amount+10"); //update 鐨勮褰曟暟 int result = query.executeUpdate(); Query query = em.createQuery("delete from OrderItem item where item.order in(from Order as o where o.amount<100)"); query.executeUpdate(); query = em.createQuery("delete from Order as o where o.amount<100"); query.executeUpdate();//delete鐨勮褰曟暟 涓嶴QL綾諱技錛孞PQL榪樻秹鍙婂埌鏇村鐨勮娉曪紝鍙互鍙傝冿細http://docs.oracle.com/cd/E11035_01/kodo41/full/html/ejb3_langref.html JPA鏀寔鏈湴浜嬪姟綆$悊錛圧ESOURCELOCAL錛夊拰瀹瑰櫒浜嬪姟綆$悊錛圝TA錛夛紝瀹瑰櫒浜嬪姟綆$悊鍙兘鐢ㄥ湪EJB/Web瀹瑰櫒鐜涓?/p> 浜嬪姟綆$悊鐨勭被鍨嬪彲浠ュ湪persistence.xml鏂囦歡涓殑“transaction-type”鍏冪礌閰嶇疆銆?/p> JPA涓氳繃EntityManager鐨刧etTransaction()鏂規硶鑾峰彇浜嬪姟鐨勫疄渚嬶紙EntityTransaction錛夛紝涔嬪悗鍙互璋冪敤浜嬪姟鐨刡egin()銆乧ommit()銆乺ollback()鏂規硶銆?/p> Date: 2012-12-30 16:46:29 CST Author: Holbrook Org version 7.8.11 with Emacs version 241 JPA姒傝堪
org.hibernate javax.persistence 璇存槑 cfg.Configuration Persistence 璇誨彇閰嶇疆淇℃伅 SessionFactory EntityManagerFactory 鐢ㄤ簬鍒涘緩浼氳瘽/瀹炰綋綆$悊鍣ㄧ殑宸ュ巶綾?/td> Session EntityManager 鎻愪緵瀹炰綋鎿嶄綔API錛岀鐞嗕簨鍔★紝鍒涘緩鏌ヨ Transaction EntityTransaction 綆$悊浜嬪姟 Query Query 鎵ц鏌ヨ 2 瀹炰綋鐢熷懡鍛ㄦ湡
3 瀹炰綋鍏崇郴鏄犲皠錛圤RM錛?/h2>
3.1 鍩烘湰鏄犲皠
瀵硅薄绔?/th> 鏁版嵁搴撶 annotion 鍙塧nnotion Class Table @Entity @Table(name="tablename") property column – @Column(name = "columnname") property primary key @Id @GeneratedValue 璇﹁ID鐢熸垚絳栫暐 property NONE @Transient 3.2 ID鐢熸垚絳栫暐
3.3 鍏寵仈鍏崇郴
鍏崇郴綾誨瀷 Owning-Side Inverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-to-many / many-to-one @ManyToOne @OneToMany(mappedBy="xxx") many-to-many @ManyToMany @ManyToMany(mappedBy ="xxx") 3.4 緇ф壙鍏崇郴
4 浜嬩歡鍙婄洃鍚?/h2>
5 Query Language 鏌ヨ璇█
5.1 浣跨敤鍙傛暟
5.2 鍛藉悕鏌ヨ
5.3 鎺掑簭
5.4 鑱氬悎鏌ヨ
5.5 鏇存柊鍜屽垹闄?/h3>
5.6 鏇村
6 浜嬪姟綆$悊
]]>
鍦↗AVA鍔犱笂LOG錛?br />
+ dataSource.getMaxActive() + ") " + "idle: " + dataSource.getNumIdle()
+ "(max: " + dataSource.getMaxIdle() + ")");
緇撴灉鏄劇ず涓猴細
active鐨勬暟閲忎竴鐩村鍔狅紝浣唅dle鐨勬暟閲忎竴鐩翠負0銆傚綋紼嬪簭鍚戦摼鎺ユ睜瑕侀摼鎺ョ殑鏃跺欙紝濡傛灉姹犳病鏈夛紝灝變細鏂板緩涓涓紝active鏁板氨浼氬姞1錛屽叧闂摼鎺ュ悗錛岄摼鎺ヤ細榪斿洖姹狅紝idle鏁板姞1銆俰dle涓?鍒欒〃紺烘睜閲屾病鏈夐摼鎺ャ?br />
榪欐牱璇存槑閾炬帴涓鐩村湪鍒涘緩錛屾病鏈夊叧闂斁鍥炴睜閲屻備絾閾炬帴鏄敱SPRING鍜孒IBERNATE綆$悊鐨勶紝浠g爜涓病鏈夊叧闂摼鎺ョ殑璇彞銆備箣鍚庤瘯浜哊澶氶厤緗紝閮借繕娌¤В鍐籌紝濡傚鍔爉axActive鏁扮瓑銆傛渶鍚庯紝鍔犱笂榪欎竴琛岋紝闂鎵嶇粓浜庤В鍐籌細
榪欓噷榛樿鍊兼槸auto錛屽鏋滄槸鐢↗TA浜嬪姟鎵嶉傜敤錛屽鏋滄槸JDBC浜嬪姟錛屽氨鍙兘鐢╝fter_transaction銆?br />
榪欐牱姣忔浜嬪姟緇撴潫鍚庯紝灝變細鍏抽棴閾炬帴榪斿洖閾炬帴姹犮?br />
]]>
We had worked on a project where we hand-coded all of our DAOs. This produced four irksome difficulties: (1) Method names and implementations were not altogether consistent. (2) It was a pain to make additional columns sortable or filterable, and as a result, a lot of pages lacked good sorting and filtering. (3) Making additional DAOs was tedious and took a fair amount of time. (4) Writing tests for DAOs is tricky and tedious, so no one really did.
This framework aims to ease our troubles.
*A fairly simple adapter is required for each JPA provider. Right now we only have an adapter for Hibernate Entity Manager. If anyone would like to contribute an adapter for any other JPA provider (OpenJPA, TopLink, etc.), that would be great.
**If time permits, we would like to eventually post our corresponding Adobe Flex 3 framework and utilities.
Wiki Documentation: UserGuide
Javadoc: http://hibernate-generic-dao.googlecode.com/svn/trunk/docs/api/index.html
Blog: http://hibernategenericdao.wordpress.com/
Please post at http://groups.google.com/group/java-generic-dao.
Simply extend the GenericDAO class with the specific type.
public interface ProjectDAO extends GenericDAO<Project, Long> {

}

public class ProjectDAOImpl extends GenericDAOImpl<Project, Long> implements ProjectDAO {

}