{"id":125,"date":"2017-04-15T13:54:11","date_gmt":"2017-04-15T05:54:11","guid":{"rendered":"http:\/\/av16874667.imwork.net:13582\/?p=125"},"modified":"2017-04-15T13:54:11","modified_gmt":"2017-04-15T05:54:11","slug":"hibernate-3-2-0%e5%ae%98%e6%96%b9%e6%b3%a8%e8%a7%a3%e6%96%87%e6%a1%a3","status":"publish","type":"post","link":"https:\/\/www.dd-home.top\/?p=125","title":{"rendered":"Hibernate 3.2.0\u5b98\u65b9\u6ce8\u89e3\u6587\u6863"},"content":{"rendered":"<div id=\"content\"><!--more--><\/div>\n<h1><\/h1>\n<h1><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/\">http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/<\/a><\/h1>\n<p>&nbsp;<\/p>\n<h1>Hibernate Annotations<\/h1>\n<h2>\u53c2\u8003\u6587\u6863<\/h2>\n<p>3.2.0 CR1<\/p>\n<hr \/>\n<p><strong>\u76ee\u5f55<\/strong><\/p>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#preface\">\u524d\u8a00<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#preface-translate-comments-zh-cn\">1. \u7ffb\u8bd1\u8bf4\u660e<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#preface-translate-licence-zh-cn\">2. \u7248\u6743\u58f0\u660e<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e199\">\u524d\u8a00<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e224\">1. \u521b\u5efa\u4e00\u4e2a\u6ce8\u89e3\u9879\u76ee<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#setup-requirements\">1.1. \u7cfb\u7edf\u9700\u6c42<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#setup-configuration\">1.2. \u7cfb\u7edf\u914d\u7f6e<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity\">2. \u5b9e\u4f53Bean<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-overview\">2.1. \u7b80\u4ecb<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#mapping\">2.2. \u7528EJB3\u6ce8\u89e3\u8fdb\u884c\u6620\u5c04<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e346\">2.2.1. \u58f0\u660e\u5b9e\u4f53bean<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e384\">2.2.1.1. \u5b9a\u4e49\u8868(Table)<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e427\">2.2.1.2. \u4e50\u89c2\u9501\u5b9a\u7248\u672c\u63a7\u5236<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e447\">2.2.2. \u6620\u5c04\u7b80\u5355\u5c5e\u6027<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e450\">2.2.2.1. \u58f0\u660e\u57fa\u672c\u7684\u5c5e\u6027\u6620\u5c04<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e559\">2.2.2.2. \u58f0\u660e\u5217\u5c5e\u6027<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e687\">2.2.2.3. \u5d4c\u5165\u5f0f\u5bf9\u8c61(\u53c8\u540d\u7ec4\u4ef6)<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e784\">2.2.2.4. \u65e0\u6ce8\u89e3\u4e4b\u5c5e\u6027\u7684\u9ed8\u8ba4\u503c<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#mapping-identifier\">2.2.. \u6620\u5c04\u4e3b\u952e\u5c5e\u6027<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e936\">2.2.4. \u6620\u5c04\u7ee7\u627f\u5173\u7cfb<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e956\">2.2.4.1. \u6bcf\u4e2a\u7c7b\u4e00\u5f20\u8868<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e977\">2.2.4.2. \u6bcf\u4e2a\u7c7b\u5c42\u6b21\u7ed3\u6784\u4e00\u5f20\u8868<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1014\">2.2.4.3. \u8fde\u63a5\u7684\u5b50\u7c7b<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1047\">2.2.4.4. \u4ece\u7236\u7c7b\u7ee7\u627f\u7684\u5c5e\u6027<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-mapping-association\">2.2.5. \u6620\u5c04\u5b9e\u4f53Bean\u7684\u5173\u8054\u5173\u7cfb<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1148\">2.2.5.1. \u4e00\u5bf9\u4e00(One-to-one)<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1291\">2.2.5.2. \u591a\u5bf9\u4e00(Many-to-one)<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-mapping-association-collections\">2.2.5.3. \u96c6\u5408\u7c7b\u578b<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1715\">2.2.5.4. \u7528cascading\u5b9e\u73b0\u4f20\u64ad\u6027\u6301\u4e45\u5316(Transitive persistence)<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1739\">2.2.5.5. \u5173\u8054\u5173\u7cfb\u83b7\u53d6<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1765\">2.2.6. \u6620\u5c04\u590d\u5408\u4e3b\u952e\u4e0e\u5916\u952e<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1823\">2.2.7. \u6620\u5c04\u4e8c\u7ea7\u8868(secondary tables)<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-mapping-query\">2.3. \u6620\u5c04\u67e5\u8be2<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e1906\">2.3.1. \u6620\u5c04EJBQL\/HQL\u67e5\u8be2<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-mapping-query-native\">2.3.2. \u6620\u5c04\u672c\u5730\u5316\u67e5\u8be2<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec\">2.4. Hibernate\u72ec\u6709\u7684\u6ce8\u89e3\u6269\u5c55<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec-entity\">2.4.1. \u5b9e\u4f53<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2195\">2.4.2. \u6807\u8bc6\u7b26<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec-property\">2.4.3. \u5c5e\u6027<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2219\">2.4.3.1. \u8bbf\u95ee\u7c7b\u578b<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2267\">2.4.3.2. \u516c\u5f0f<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2276\">2.4.3.3. \u7c7b\u578b<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2299\">2.4.3.4. \u7d22\u5f15<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2309\">2.4.3.5. @Parent<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2316\">2.4.3.6. \u751f\u6210\u7684\u5c5e\u6027<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2341\">2.4.4. \u7ee7\u627f<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2354\">2.4.5. \u5173\u4e8e\u5355\u4e2a\u5173\u8054\u5173\u7cfb\u7684\u6ce8\u89e3<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2382\">2.4.5.1. \u5ef6\u8fdf\u9009\u9879\u548c\u83b7\u53d6\u6a21\u5f0f<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec-collection\">2.4.6. \u5173\u4e8e\u96c6\u5408\u7c7b\u578b\u7684\u6ce8\u89e3<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2502\">2.4.6.1. \u53c2\u6570\u6ce8\u89e3<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2530\">2.4.6.2. \u66f4\u591a\u7684\u96c6\u5408\u7c7b\u578b<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2613\">2.4.7. \u7f13\u5b58<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2646\">2.4.8. \u8fc7\u6ee4\u5668<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2678\">2.4.9. \u67e5\u8be2<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#xml-overriding\">3. \u901a\u8fc7XML\u8986\u5199\u5143\u6570\u636e<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2735\">3.1. \u539f\u5219<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2742\">3.1.1. \u5168\u5c40\u7ea7\u522b\u7684\u5143\u6570\u636e<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2761\">3.1.2. \u5b9e\u4f53\u7ea7\u522b\u7684\u5143\u6570\u636e<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2923\">3.1.3. \u5c5e\u6027\u7ea7\u522b\u7684\u5143\u6570\u636e<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e2968\">3.1.4. \u5173\u8054\u7ea7\u522b\u7684\u5143\u6570\u636e<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#validator\">4. Hibernate\u9a8c\u8bc1\u5668<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#validator-constraints\">4.1. \u7ea6\u675f<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3043\">4.1.1. \u4ec0\u4e48\u662f\u7ea6\u675f\uff1f<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3048\">4.1.2. \u5185\u5efa\u7ea6\u675f<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#validator-constraints-error\">4.1.3. \u9519\u8bef\u4fe1\u606f<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3208\">4.1.4. \u7f16\u5199\u4f60\u81ea\u5df1\u7684\u7ea6\u675f<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3262\">4.1.5. \u6ce8\u89e3\u4f60\u7684\u9886\u57df\u6a21\u578b<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3279\">4.2. \u4f7f\u7528\u9a8c\u8bc1\u5668\u6846\u67b6<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3284\">4.2.1. \u6570\u636e\u5e93schema\u5c42\u6b21\u9a8c\u8bc1<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3295\">4.2.2. Hibernate\u57fa\u4e8e\u4e8b\u4ef6\u7684\u9a8c\u8bc1<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3318\">4.2.3. \u7a0b\u5e8f\u7ea7\u9a8c\u8bc1<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3341\">4.2.4. \u9a8c\u8bc1\u4fe1\u606f<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#lucene\">5. Hibernate\u4e0eLucene\u96c6\u6210<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#lucene-intro\">5.1. \u4f7f\u7528Lucene\u4e3a\u5b9e\u4f53\u5efa\u7acb\u7d22\u5f15<\/a><\/li>\n<li>\n<ul class=\" list-paddingleft-2\">\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3390\">5.1.1. \u6ce8\u89e3\u9886\u57df\u6a21\u578b<\/a><\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3448\">5.1.2. \u542f\u7528\u81ea\u52a8\u7d22\u5f15<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#d0e3458\">A. \u672f\u8bed\u8868<\/a><\/li>\n<\/ul>\n<h2><a name=\"preface\"><\/a>\u524d\u8a00<\/h2>\n<p>WARNING! This is a translated version of the English Hibernate reference documentation. The translated version might not be up to date! However, the differences should only be very minor. Consult the English reference documentation if you are missing information or encounter a translation error. If you like to contribute to a particular translation, contact us on the Hibernate developer mailing list.<\/p>\n<p>Translator(s): RedSaga Translate Team \u6ee1\u6c5f\u7ea2\u7ffb\u8bd1\u56e2\u961f &lt;caoxg@yahoo.com&gt;<\/p>\n<h2><a name=\"preface-translate-comments-zh-cn\"><\/a>1.\u00a0\u7ffb\u8bd1\u8bf4\u660e<\/h2>\n<p>\u672c\u6587\u6863\u7684\u7ffb\u8bd1\u662f\u5728\u7f51\u7edc\u4e0a\u534f\u4f5c\u8fdb\u884c\u7684\uff0c\u4e5f\u4f1a\u4e0d\u65ad\u6839\u636eHibernate\u7684\u5347\u7ea7\u8fdb\u884c\u66f4\u65b0\u3002\u63d0\u4f9b\u6b64\u6587\u6863\u7684\u76ee\u7684\u662f\u4e3a\u4e86\u51cf\u7f13\u5b66\u4e60Hibernate\u7684\u5761\u5ea6\uff0c\u800c\u975e\u4ee3\u66ff\u539f\u6587\u6863\u3002\u6211\u4eec\u5efa\u8bae\u6240\u6709\u6709\u80fd\u529b\u7684\u8bfb\u8005\u90fd\u76f4\u63a5\u9605\u8bfb\u82f1\u6587\u539f\u6587\u3002\u82e5\u60a8\u5bf9\u7ffb\u8bd1\u6709\u5f02\u8bae\uff0c\u6216\u53d1\u73b0\u7ffb\u8bd1\u9519\u8bef\uff0c\u656c\u8bf7\u4e0d\u541d\u8d50\u6559\uff0c\u62a5\u544a\u5230\u5982\u4e0b\u5730\u5740\uff1ahttp:\/\/wiki.redsaga.com\/confluence\/display\/HART\/Home<\/p>\n<p><a name=\"redsaga-translate-team\"><\/a><\/p>\n<p><strong>\u8868\u00a01.\u00a0Hibernate Annotation v3\u7ffb\u8bd1\u56e2\u961f<\/strong><\/p>\n<table summary=\"Hibernate Annotation v3\u7ffb\u8bd1\u56e2\u961f\">\n<colgroup>\n<col \/>\n<col \/>\n<col \/>\n<col \/>\n<col \/>\n<col \/><\/colgroup>\n<thead>\n<tr class=\"firstRow\">\n<th>\u5e8f\u53f7<\/th>\n<th>\u6807\u9898<\/th>\n<th>\u4e2d\u6587\u6807\u9898<\/th>\n<th>\u7ffb\u8bd1<\/th>\n<th>1\u5ba1<\/th>\n<th>2\u5ba1<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>&#8212;<\/td>\n<td>Contents<\/td>\n<td>\u76ee\u5f55<\/td>\n<td>Liu Chang<\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>#1<\/td>\n<td>Setting up an annotations projec<\/td>\n<td>\u521b\u5efa\u4e00\u4e2a\u6ce8\u89e3\u9879\u76ee<\/td>\n<td>melthaw<\/td>\n<td>Zheng Shuai<\/td>\n<td>superq<\/td>\n<\/tr>\n<tr>\n<td>#2<\/td>\n<td>Entity Beans-Introduction<\/td>\n<td>\u5b9e\u4f53Bean-\u7b80\u4ecb<\/td>\n<td>melthaw<\/td>\n<td>Zheng Shuai<\/td>\n<td>superq<\/td>\n<\/tr>\n<tr>\n<td>#3<\/td>\n<td>Entity Beans-Mapping with EJB3 Annotations<\/td>\n<td>\u5b9e\u4f53Bean-\u7528EJB3\u6ce8\u89e3\u8fdb\u884c\u6620\u5c04<\/td>\n<td>melthaw<\/td>\n<td>Zheng Shuai<\/td>\n<td>superq, Liu Chang, Sean Chan<\/td>\n<\/tr>\n<tr>\n<td>#4<\/td>\n<td>Entity Beans-Mapping Queries<\/td>\n<td>\u5b9e\u4f53Bean-\u6620\u5c04\u67e5\u8be2<\/td>\n<td>melthaw<\/td>\n<td>Zheng Shuai<\/td>\n<td>superq, Liu Chang, Sean Chan<\/td>\n<\/tr>\n<tr>\n<td>#5<\/td>\n<td>Entity Beans-Hibernate Annotation Extensions<\/td>\n<td>\u5b9e\u4f53Bean-Hibernate\u72ec\u6709\u7684\u6ce8\u89e3\u6269\u5c55<\/td>\n<td>Sean Chan<\/td>\n<td>morning<\/td>\n<td>melthaw<\/td>\n<\/tr>\n<tr>\n<td>#6<\/td>\n<td>Overriding metadata through XML<\/td>\n<td>\u901a\u8fc7XML\u8986\u5199\u5143\u6570\u636e<\/td>\n<td>icess<\/td>\n<td>melthaw<\/td>\n<td>Sean Chan<\/td>\n<\/tr>\n<tr>\n<td>#7<\/td>\n<td>Hibernate Validator<\/td>\n<td>Hibernate\u9a8c\u8bc1\u5668<\/td>\n<td>DigitalSonic<\/td>\n<td>morning<\/td>\n<td>melthaw<\/td>\n<\/tr>\n<tr>\n<td>#8<\/td>\n<td>Hibernate Lucene Integration<\/td>\n<td>Hibernate\u4e0eLucene\u96c6\u6210<\/td>\n<td>mochow<\/td>\n<td>morning<\/td>\n<td>melthaw<\/td>\n<\/tr>\n<tr>\n<td>#9<\/td>\n<td>Appendix:Glossary<\/td>\n<td>\u9644\u5f55:\u672f\u8bed\u8868<\/td>\n<td>mochow<\/td>\n<td>Liu Chang<\/td>\n<td>\u66f9\u6653\u94a2<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5173\u4e8e\u6211\u4eec<\/p>\n<ul class=\" list-paddingleft-2\">\n<li>\u6ee1\u6c5f\u7ea2.\u5f00\u6e90, http:\/\/www.redsaga.com<\/li>\n<li>\u4ece\u6210\u7acb\u4e4b\u521d\u5c31\u81f4\u529b\u4e8eJava\u5f00\u653e\u6e90\u4ee3\u7801\u5728\u4e2d\u56fd\u7684\u4f20\u64ad\u4e0e\u53d1\u5c55,\u4e0e\u56fd\u5185\u591a\u4e2aJava\u56e2\u4f53\u53ca\u51fa\u7248\u793e\u6709\u6df1\u5165\u4ea4\u6d41\u3002\u575a\u6301\u5c11\u8bf4\u591a\u505a\u7684\u539f\u5219\uff0c\u76ee\u524d\u6709\u4e24\u4e2a\u56e2\u961f\uff0c\u201cOpenDoc\u56e2\u961f\u201d\u4e0e\u201c\u7ffb\u8bd1\u56e2\u961f\u201d\uff0c\u672c\u7ffb\u8bd1\u6587\u6863\u5373\u4e3a\u7ffb\u8bd1\u56e2\u961f\u4f5c\u54c1\u3002OpenDoc\u56e2\u961f\u5df2\u7ecf\u63a8\u51fa\u5305\u62ecHibernate\u3001iBatis\u3001Spring\u3001WebWork\u7684\u591a\u4efd\u5f00\u653e\u6587\u6863\uff0c\u5e76\u4e8e2005\u5e745\u6708\u5728Hibernate\u5f00\u653e\u6587\u6863\u57fa\u7840\u4e0a\u6269\u5145\u6210\u4e66\uff0c\u51fa\u7248\u4e86\u539f\u521b\u4e66\u7c4d\uff1a\u300a\u6df1\u5165\u6d45\u51faHibernate\u300b\uff0c\u672c\u4e66400\u4f59\u9875\uff0c\u9002\u5408\u5404\u4e2a\u5c42\u6b21\u7684Hibernate\u7528\u6237\u3002(http:\/\/www.redsaga.com\/hibernate_book.html)\u656c\u8bf7\u652f\u6301\u3002<\/li>\n<li>\u81f4\u8c22<\/li>\n<li>\u5728\u6211\u4eec\u7ffb\u8bd1Hibernate Annotation\u53c2\u8003\u6587\u6863\u7684\u540c\u65f6\uff0c\u8fd8\u6709\u4e00\u4f4d\u70ed\u5fc3\u7684\u670b\u53cb\u4e5f\u5728\u8fdb\u884c\u7740\u540c\u6837\u7684\u5de5\u4f5c\uff0c\u8fd9\u4f4d\u670b\u53cb\u5c31\u662ficess(\u51b0\u96e8)\uff0c\u7531icess\u7ffb\u8bd1\u7684\u4e2d\u6587\u7248\u7684\u5730\u5740\uff1a http:\/\/icess.my.china.com\/hibernate\/a\/ref\/index.htm<\/li>\n<\/ul>\n<h2><a name=\"preface-translate-licence-zh-cn\"><\/a>2.\u00a0\u7248\u6743\u58f0\u660e<\/h2>\n<p>Hibernate\u82f1\u6587\u6587\u6863\u5c5e\u4e8eHibernate\u53d1\u884c\u5305\u7684\u4e00\u90e8\u5206\uff0c\u9075\u5faaLGPL\u534f\u8bae\u3002\u672c\u7ffb\u8bd1\u7248\u672c\u540c\u6837\u9075\u5faaLGPL\u534f\u8bae\u3002\u53c2\u4e0e\u7ffb\u8bd1\u7684\u8bd1\u8005\u4e00\u81f4\u540c\u610f\u653e\u5f03\u9664\u7f72\u540d\u6743\u5916\u5bf9\u672c\u7ffb\u8bd1\u7248\u672c\u7684\u5176\u5b83\u6743\u5229\u8981\u6c42\u3002<\/p>\n<p>\u60a8\u53ef\u4ee5\u81ea\u7531\u94fe\u63a5\u3001\u4e0b\u8f7d\u3001\u4f20\u64ad\u6b64\u6587\u6863\uff0c\u6216\u8005\u653e\u7f6e\u5728\u60a8\u7684\u7f51\u7ad9\u4e0a\uff0c\u751a\u81f3\u4f5c\u4e3a\u4ea7\u54c1\u7684\u4e00\u90e8\u5206\u53d1\u884c\u3002\u4f46\u524d\u63d0\u662f\u5fc5\u987b\u4fdd\u8bc1\u5168\u6587\u5b8c\u6574\u8f6c\u8f7d\uff0c\u5305\u62ec\u5b8c\u6574\u7684\u7248\u6743\u4fe1\u606f\u548c\u4f5c\u8bd1\u8005\u58f0\u660e\uff0c\u5e76\u4e0d\u80fd\u8fdd\u53cdLGPL\u534f\u8bae\u3002\u8fd9\u91cc\u201c\u5b8c\u6574\u201d\u7684\u542b\u4e49\u662f\uff0c\u4e0d\u80fd\u8fdb\u884c\u4efb\u4f55\u5220\u9664\/\u589e\u6dfb\/\u6ce8\u89e3\u3002\u82e5\u6709\u5220\u9664\/\u589e\u6dfb\/\u6ce8\u89e3\uff0c\u5fc5\u987b\u9010\u6bb5\u660e\u786e\u58f0\u660e\u90a3\u4e9b\u90e8\u5206\u5e76\u975e\u672c\u6587\u6863\u7684\u4e00\u90e8\u5206\u3002<\/p>\n<h2><a name=\"d0e199\"><\/a>\u524d\u8a00<\/h2>\n<p>\u6b63\u5982\u5176\u4ed6\u7684ORM\u5de5\u5177,Hibernate\u540c\u6837\u9700\u8981\u5143\u6570\u636e\u6765\u63a7\u5236\u5728\u4e0d\u540c\u6570\u636e\u8868\u8fbe\u5f62\u5f0f\u4e4b\u95f4\u7684\u8f6c\u5316. \u5728Hibernate 2.x\u91cc,\u591a\u6570\u60c5\u51b5\u4e0b\u8868\u793a\u6620\u5c04\u5173\u7cfb\u7684\u5143\u6570\u636e\u4fdd\u5b58\u5728XML\u6587\u672c\u6587\u4ef6\u4e2d. \u8fd8\u6709\u4e00\u79cd\u65b9\u5f0f\u5c31\u662fXdoclet,\u5b83\u53ef\u4ee5\u5728\u7f16\u8bd1\u65f6\u5229\u7528Javadoc\u4e2d\u7684\u6e90\u7801\u6ce8\u91ca\u4fe1\u606f\u6765\u8fdb\u884c\u9884\u5904\u7406. \u73b0\u5728\u65b0\u7684JDK\u6807\u51c6\uff08JDK1.5\u4ee5\u4e0a\uff09\u4e5f\u652f\u6301\u7c7b\u4f3c\u7684\u6ce8\u89e3\u529f\u80fd,\u4f46\u76f8\u6bd4\u4e4b\u4e0b\u5f88\u591a\u5de5\u5177\u5bf9\u6b64\u63d0\u4f9b\u4e86\u66f4\u5f3a\u5927\u66f4\u597d\u7528\u7684\u652f\u6301. \u4ee5IntelliJ IDEA\u548cEclipse\u4e3a\u4f8b,\u8fd9\u4e9bIDE\u5de5\u5177\u4e3aJDK 5.0\u6ce8\u89e3\u529f\u80fd\u63d0\u4f9b\u4e86\u81ea\u52a8\u5b8c\u6210\u548c\u8bed\u6cd5\u9ad8\u4eae\u529f\u80fd. \u6ce8\u89e3\u88ab\u76f4\u63a5\u7f16\u8bd1\u5230\u5b57\u8282\u7801\u91cc,\u5e76 \u5728\u8fd0\u884c\u65f6\uff08\u5bf9\u4e8eHibernate\u6765\u8bb2\u5c31\u662f\u542f\u52a8\u7684\u65f6\u5019\uff09\u901a\u8fc7\u53cd\u5c04\u8bfb\u53d6\u8fd9\u4e9b\u6ce8\u89e3, \u56e0\u6b64\u5916\u90e8XML\u6587\u4ef6\u5c31\u4e0d\u518d\u9700\u8981\u4e86.<\/p>\n<p>EJB3\u89c4\u8303\u6700\u7ec8\u8ba4\u53ef\u4e86\u900f\u660e\u5316ORM\u7684\u6210\u529f\u8303\u4f8b\u4ee5\u53ca\u5e02\u573a\u5bf9\u4e8e\u8fd9\u79cd\u6280\u672f\u7684\u5174\u8da3. EJB3\u89c4\u8303\u6807\u51c6\u5316\u4e86ORM\u7684\u57fa\u7840API\u800c\u4e14\u5728\u4efb\u4f55ORM\u6301\u4e45\u5316\u673a\u5236\u4e2d\u4f7f\u7528\u5143\u6570\u636e.\u00a0<em>Hibernate EntityManager<\/em>\u5b9e\u73b0\u4e86EJB3\u6301\u4e45\u5316\u89c4\u8303\u4e2d\u5b9a\u4e49\u7684\u7f16\u7a0b\u63a5\u53e3\u548c\u751f\u547d\u5468\u671f\u89c4\u5219. \u5728<em>Hibernate Core<\/em>\u7684\u57fa\u7840\u4e0a\u518d\u7ed3\u5408<em>Hibernate Annotations<\/em>\u5c31\u5b9e\u73b0\u4e86\u4e00\u5957\u5b8c\u6574(\u5e76\u4e14\u72ec\u7acb)\u7684EJB3\u6301\u4e45\u5316\u89e3\u51b3\u65b9\u6848. \u4f60\u53ef\u4ee5\u7ed3\u5408\u4e09\u8005\u6765\u4f7f\u7528,\u4e5f\u53ef\u4ee5\u629b\u5f00EJB3\u7f16\u7a0b\u63a5\u53e3\u548c\u751f\u547d\u5468\u671f\u89c4\u5219\u800c\u72ec\u7acb\u4f7f\u7528\u6ce8\u89e3, \u751a\u81f3\u53ea\u5355\u72ec\u4f7f\u7528<em>Hibernate Core<\/em>. \u8fd9\u4e9b\u90fd\u53d6\u51b3\u4e8e\u9879\u76ee\u7684\u5546\u4e1a\u548c\u6280\u672f\u4e0a\u7684\u5b9e\u9645\u9700\u6c42. Hibernate\u5141\u8bb8\u4f60\u76f4\u63a5\u4f7f\u7528native APIs,\u5982\u679c\u6709\u9700\u8981, \u751a\u81f3\u53ef\u4ee5\u76f4\u63a5\u64cd\u4f5cJDBC\u548cSQL.<\/p>\n<p>\u6ce8\u610f\u672c\u6587\u6863\u57fa\u4e8eHibernate Annotations\u7684\u9884\u89c8\u7248(\u9075\u4eceEJB 3.0\/JSR-220\u6700\u7ec8\u8349\u6848). \u8fd9\u4e2a\u7248\u672c\u548c\u65b0\u89c4\u8303\u4e2d\u5b9a\u4e49\u7684\u6700\u7ec8\u6982\u5ff5\u5df2\u7ecf\u975e\u5e38\u63a5\u8fd1\u4e86.\u6211\u4eec\u7684\u76ee\u6807\u662f\u63d0\u4f9b\u4e00\u5957\u5b8c\u6574\u7684ORM\u6ce8\u89e3, \u5305\u62ecEJB3\u7684\u6807\u51c6\u6ce8\u89e3\u4ee5\u53caHibernate3\u7684\u6269\u5c55\uff08\u540e\u8005\u662fEJB3\u89c4\u8303\u4e2d\u6ca1\u6709\u6d89\u53ca\u5230\u7684\uff09. \u6700\u7ec8\u901a\u8fc7\u6ce8\u89e3\u4f60\u53ef\u4ee5\u5b8c\u6210\u4efb\u4f55\u53ef\u80fd\u7684\u6620\u5c04.\u8be6\u60c5\u53c2\u8003???.<\/p>\n<p>EJB3\u6700\u7ec8\u8349\u6848\u4fee\u6539\u4e86\u90e8\u5206\u6ce8\u89e3, http:\/\/www.hibernate.org\/371.html\u63d0\u4f9b\u4e86\u4ece\u4e0a\u4e00\u4e2a\u7248\u672c\u5230\u6700\u65b0\u7248\u672c\u7684\u8fc1\u79fb\u6307\u5357.<\/p>\n<h2><a name=\"d0e224\"><\/a>\u7b2c\u00a01\u00a0\u7ae0\u00a0\u521b\u5efa\u4e00\u4e2a\u6ce8\u89e3\u9879\u76ee<\/h2>\n<h2><a name=\"setup-requirements\"><\/a>1.1.\u00a0\u7cfb\u7edf\u9700\u6c42<\/h2>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u9996\u5148\u4eceHibernate\u5b98\u65b9\u7f51\u7ad9\u4e0b\u8f7d\u5e76\u89e3\u538bHibernate Annotations\u7684\u53d1\u5e03\u5305\u3002<\/li>\n<li><em>\u8fd9\u4e2a\u7248\u672c(\u9884\u89c8\u7248)\u8981\u6c42\u4f7f\u7528Hibernate 3.2.0.CR2\u6216\u66f4\u9ad8\u7248\u672c\u3002\u8bf7\u4e0d\u8981\u548c\u8001\u7248\u672c\u7684Hibernate 3.x\u6df7\u5408\u8d77\u6765\u4f7f\u7528\u3002<\/em><\/li>\n<li>\u8fd9\u4e2a\u7248\u672c\u5728Hibernate core 3.2.0.CR2\u7684\u57fa\u7840\u4e0a\u5de5\u4f5c\u826f\u597d\u3002<\/li>\n<li>\u9996\u5148\u786e\u5b9a\u4f60\u5df2\u7ecf\u5b89\u88c5\u4e86JDK 5.0\u3002\u5f53\u7136\u5c31\u7b97\u4f7f\u7528\u4f4e\u7248\u672c\u7684JDK\uff0c Xdoclet\u4e5f\u53ef\u4ee5\u63d0\u4f9b\uff08\u57fa\u4e8e\u6ce8\u89e3\u7684\uff09\u5143\u6570\u636e\u6240\u5e26\u6765\u7684\u90e8\u5206\u529f\u80fd\u3002 \u4e0d\u8fc7\u8bf7\u6ce8\u610f\u672c\u6587\u6863\u53ea\u63cf\u8ff0\u8ddfJDK5.0\u6ce8\u89e3\u6709\u5173\u7684\u5185\u5bb9\uff0c\u5173\u4e8eXdoclet\u8bf7\u53c2\u8003\u76f8\u5173\u6587\u6863\u3002<\/li>\n<\/ul>\n<h2><a name=\"setup-configuration\"><\/a>1.2.\u00a0\u7cfb\u7edf\u914d\u7f6e<\/h2>\n<p>\u9996\u5148\u5c31\u662f\u8bbe\u7f6eclasspath(\u5f53\u7136\u662f\u5728IDE\u4e2d\u521b\u5efa\u4e86\u4e00\u4e2a\u65b0\u9879\u76ee\u4e4b\u540e)\u3002<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u5c06Hibernate3\u6838\u5fc3\u6587\u4ef6\u4ee5\u53ca\u5176\u4f9d\u8d56\u7684\u7b2c\u4e09\u65b9\u5e93\u6587\u4ef6(\u8bf7\u53c2\u8003lib\/README.txt\u6587\u4ef6)\u52a0\u5165\u5230\u4f60\u7684classpath\u91cc\u9762\u3002<\/li>\n<li>\u5c06<tt>hibernate-annotations.jar<\/tt>\u00a0\u548c<tt>lib\/ejb3-persistence.jar<\/tt>\u52a0\u5165\u5230\u4f60\u7684classpath\u91cc\u9762\u3002<\/li>\n<li>\u5982\u679c\u8981\u4f7f\u7528\u00a0<a title=\"\u7b2c\u00a05\u00a0\u7ae0\u00a0Hibernate\u4e0eLucene\u96c6\u6210\" href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#lucene\">\u7b2c\u00a05\u00a0\u7ae0\u00a0<em>Hibernate\u4e0eLucene\u96c6\u6210<\/em><\/a>\uff0c\u8fd8\u9700\u8981\u5c06lucene\u7684jar\u6587\u4ef6\u52a0\u5165\u4f60\u7684classpath\u3002<\/li>\n<\/ul>\n<p>\u6211\u4eec\u63a8\u8350\u5728\u4e00\u4e2a\u5305\u88c5\u5668(wrapper)\u7c7b<tt>HibernateUtil<\/tt>\u00a0\u7684\u9759\u6001\u521d\u59cb\u5316\u4ee3\u7801\u5757\u4e2d\u542f\u52a8Hibernate\u3002\u6216\u8bb8\u4f60\u5728Hibernate\u6587\u6863\u7684\u5176\u4ed6\u5f88\u591a\u5730\u65b9\u770b\u5230\u8fc7\u8fd9\u4e2a\u7c7b\uff0c \u4f46\u662f\u8981\u5728\u4f60\u7684\u9879\u76ee\u4e2d\u4f7f\u7528\u6ce8\u89e3\uff0c\u8fd8\u9700\u8981\u5bf9\u8fd9\u4e2a\u8f85\u52a9(helper)\u7c7b\u8fdb\u884c\u6269\u5c55\u3002\u6269\u5c55\u5982\u4e0b:<\/p>\n<pre>package\u00a0hello;\u00a0import\u00a0org.hibernate.*;\u00a0import\u00a0org.hibernate.cfg.*;\u00a0import\u00a0test.*;\u00a0import\u00a0test.animals.Dog;\u00a0public\u00a0class\u00a0HibernateUtil\u00a0{\u00a0private\u00a0static\u00a0final\u00a0SessionFactory\u00a0sessionFactory;\u00a0\u00a0\u00a0\u00a0\u00a0static\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sessionFactory\u00a0=\u00a0new\u00a0AnnotationConfiguration().buildSessionFactory();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0catch\u00a0(Throwable\u00a0ex)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0Log\u00a0exception!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw\u00a0new\u00a0ExceptionInInitializerError(ex);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0static\u00a0Session\u00a0getSession()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throws\u00a0HibernateException\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0sessionFactory.openSession();\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<p>\u8fd9\u91cc\u6bd4\u8f83\u6709\u610f\u601d\u7684\u662f\u4f7f\u7528\u5230\u4e86<tt>AnnotationConfiguration<\/tt>\u7c7b\u3002 \u5728XML\u914d\u7f6e\u6587\u4ef6(\u901a\u5e38\u662f<tt>hibernate.cfg.xml<\/tt>)\u4e2d\u5219\u5b9a\u4e49\u4e86\u5305\u548c\u7ecf\u8fc7\u6ce8\u89e3\u7684\u7c7b\u3002\u4e0b\u9762\u7684xml\u548c\u524d\u9762\u7684\u58f0\u660e\u7b49\u4ef7:<\/p>\n<pre>&lt;!DOCTYPE\u00a0hibernate-configuration\u00a0PUBLIC\u00a0\u00a0\u00a0\u00a0\u00a0\"-\/\/Hibernate\/Hibernate\u00a0Configuration\u00a0DTD\u00a03.0\/\/EN\"\u00a0\u00a0\u00a0\u00a0\u00a0\"http:\/\/hibernate.sourceforge.net\/hibernate-configuration-3.0.dtd\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;hibernate-configuration&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;session-factory&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;mapping\u00a0package=\"test.animals\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;mapping\u00a0class=\"test.Flight\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;mapping\u00a0class=\"test.Sky\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;mapping\u00a0class=\"test.Person\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;mapping\u00a0class=\"test.animals.Dog\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;mapping\u00a0resource=\"test\/animals\/orm.xml\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/session-factory&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/hibernate-configuration&gt;<\/pre>\n<p>\u6ce8\u610f\u73b0\u5728\u4f60\u53ef\u4ee5\u6df7\u5408\u4f7f\u7528hbm.xml\u548c\u6ce8\u89e3\u3002\u8d44\u6e90\u5143\u7d20(resource element)\u53ef\u4ee5\u662fhbm\u6587\u4ef6\u4e5f\u53ef\u4ee5\u662fEJB3 XML\u53d1\u5e03\u63cf\u8ff0\u7b26\uff0c\u6b64\u5dee\u522b\u5bf9\u4e8e\u914d\u7f6e\u8fc7\u7a0b\u662f\u900f\u660e\u7684\u3002<\/p>\n<p>\u9664\u4e86\u4e0a\u9762\u7684\u65b9\u5f0f,\u4f60\u8fd8\u53ef\u4ee5\u901a\u8fc7\u7f16\u7a0b\u7684\u65b9\u5f0f\u5b9a\u4e49\u5305\u62ec\u6ce8\u89e3\u7684\u7c7b\u548c\u5305<\/p>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sessionFactory\u00a0=\u00a0new\u00a0AnnotationConfiguration()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.addPackage(\"test.animals\")\u00a0\/\/the\u00a0fully\u00a0qualified\u00a0package\u00a0name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.addAnnotatedClass(Flight.class)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.addAnnotatedClass(Sky.class)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.addAnnotatedClass(Person.class)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.addAnnotatedClass(Dog.class)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.buildSessionFactory();<\/pre>\n<p>\u4f60\u4e5f\u53ef\u4ee5\u4f7f\u7528Hibernate Entity Manager\u6765\u5b8c\u6210\u4ee5\u4e0a\u529f\u80fd\u3002Hibernate Entity Manager\u6709\u81ea\u5df1\u7684\u4e00\u5957\u914d\u7f6e\u673a\u5236\uff0c\u8be6\u60c5\u8bf7\u53c2\u8003\u76f8\u5173\u6587\u6863\u3002<\/p>\n<p>\u9664\u4e86\u542f\u52a8\u65b9\u5f0f\u548c\u914d\u7f6e\u6587\u4ef6\u6709\u6240\u6539\u53d8\u4e4b\u5916\uff0c\u7ed3\u5408\u6ce8\u89e3\u6765\u4f7f\u7528Hibernate API\u548c\u4ee5\u524d\u6ca1\u6709\u4ec0\u4e48\u533a\u522b\uff0c \u5728\u5176\u4ed6\u65b9\u9762\u4f60\u8fd8\u662f\u53ef\u4ee5\u7ee7\u7eed\u4fdd\u6301\u4ee5\u524d\u7684\u4e60\u60ef\u548c\u559c\u597d(<tt>hibernate.properties<\/tt>\uff0c\u00a0<tt>hibernate.cfg.xml<\/tt>\uff0c programmatic APIs\u7b49\u7b49)\u3002 \u751a\u81f3\u5bf9\u4e8e\u540c\u4e00\u4e2a<tt>SessionFactory<\/tt>\uff0c\u4f60\u90fd\u53ef\u4ee5\u6df7\u5408\u5e26\u6ce8\u89e3\u7684\u6301\u4e45\u7c7b\u4ee5\u53ca\u4f20\u7edf\u7684bm.cfg.xml\u58f0\u660e\u65b9\u5f0f\u3002 \u7136\u800c\u4f60\u4e0d\u80fd\u591a\u6b21\u58f0\u660e\u540c\u4e00\u4e2a\u7c7b(\u8981\u4e48\u901a\u8fc7\u6ce8\u89e3\u8981\u4e48\u901a\u8fc7hbm.xml\u914d\u7f6e\u6587\u4ef6)\uff0c \u800c\u4e14\u5728\u4e00\u4e2a\u6620\u5c04\u5b9e\u4f53\u7684\u7c7b\u7ee7\u627f\u5c42\u6b21\u4e2d\uff0c\u8fd9\u4e24\u4e2a\u914d\u7f6e\u7b56\u7565\u4e0d\u80fd\u540c\u65f6\u4f7f\u7528.<\/p>\n<p>\u4e3a\u4e86\u7b80\u5316\u4ecehbm\u6587\u4ef6\u5230\u6ce8\u89e3\u7684\u8fc1\u79fb\u8fc7\u7a0b\uff0c \u914d\u7f6e\u673a\u5236\u5c06\u81ea\u52a8\u68c0\u6d4b\u5728\u6ce8\u89e3\u548chbm\u6587\u4ef6\u4e2d\u91cd\u590d\u7684\u6620\u5c04\u3002 \u9ed8\u8ba4\u60c5\u51b5\u4e0bhbm\u6587\u4ef6\u4e2d\u7684\u58f0\u660e\u6bd4\u7c7b\u4e2d\u7684\u6ce8\u89e3\u5143\u6570\u636e\u5177\u6709\u66f4\u9ad8\u7684\u4f18\u5148\u7ea7\u3002 \u8fd9\u79cd\u4f18\u5148\u7ea7\u7684\u8bbe\u5b9a\u662f\u4ee5\u7c7b\u4e3a\u5355\u4f4d\u7684\u3002 \u4f60\u4e5f\u53ef\u4ee5\u901a\u8fc7<tt>hibernate.mapping.precedence<\/tt>\u4fee\u6539\u8fd9\u79cd\u4f18\u5148\u7ea7\u3002 \u9ed8\u8ba4\u7684\u503c\u662f<tt>hbm, class<\/tt>\uff0c \u5982\u679c\u6539\u4e3a<tt>class,hbm<\/tt>\uff0c\u5f53\u53d1\u751f\u51b2\u7a81\u7684\u65f6\u5019\uff0c\u7c7b\u4e2d\u7684\u6ce8\u89e3\u5c06\u6bd4hbm\u6587\u4ef6\u5177\u6709\u66f4\u9ad8\u7684\u4f18\u5148\u7ea7\u3002<\/p>\n<h2><a name=\"entity\"><\/a>\u7b2c\u00a02\u00a0\u7ae0\u00a0\u5b9e\u4f53Bean<\/h2>\n<h2><a name=\"entity-overview\"><\/a>2.1.\u00a0\u7b80\u4ecb<\/h2>\n<p>\u672c\u7ae0\u5185\u5bb9\u8986\u76d6\u4e86EJB3.0\u5b9e\u4f53bean\u7684\u6ce8\u89e3\u89c4\u8303\u4ee5\u53caHibernate\u7279\u6709\u7684\u6269\u5c55.<\/p>\n<h2><a name=\"mapping\"><\/a>2.2.\u00a0\u7528EJB3\u6ce8\u89e3\u8fdb\u884c\u6620\u5c04<\/h2>\n<p>\u73b0\u5728EJB3\u5b9e\u4f53Bean\u662f\u7eaf\u7cb9\u7684POJO.\u5b9e\u9645\u4e0a\u8fd9\u8868\u8fbe\u4e86\u548cHibernate\u6301\u4e45\u5316\u5b9e\u4f53\u5bf9\u8c61\u540c\u6837\u7684\u6982\u5ff5. \u5b83\u4eec\u7684\u6620\u5c04\u90fd\u901a\u8fc7JDK5.0\u6ce8\u89e3\u6765\u5b9a\u4e49(EJB3\u89c4\u8303\u4e2d\u7684XML\u63cf\u8ff0\u8bed\u6cd5\u81f3\u4eca\u8fd8\u6ca1\u6709\u6700\u7ec8\u5b9a\u4e0b\u6765). \u6ce8\u89e3\u5206\u4e3a\u4e24\u4e2a\u90e8\u5206,\u5206\u522b\u662f\u903b\u8f91\u6620\u5c04\u6ce8\u89e3\u548c\u7269\u7406\u6620\u5c04\u6ce8\u89e3, \u901a\u8fc7\u903b\u8f91\u6620\u5c04\u6ce8\u89e3\u53ef\u4ee5\u63cf\u8ff0\u5bf9\u8c61\u6a21\u578b,\u7c7b\u4e4b\u95f4\u7684\u5173\u7cfb\u7b49\u7b49, \u800c\u7269\u7406\u6620\u5c04\u6ce8\u89e3\u5219\u63cf\u8ff0\u4e86\u7269\u7406\u7684schema,\u8868,\u5217,\u7d22\u5f15\u7b49\u7b49. \u4e0b\u9762\u6211\u4eec\u5728\u4ee3\u7801\u4e2d\u5c06\u6df7\u5408\u4f7f\u7528\u8fd9\u4e24\u79cd\u7c7b\u578b\u7684\u6ce8\u89e3.<\/p>\n<p>EJB3\u6ce8\u89e3\u7684API\u5b9a\u4e49\u5728<tt>javax.persistence.*<\/tt>\u5305\u91cc\u9762. \u5927\u90e8\u5206\u548cJDK5\u517c\u5bb9\u7684IDE(\u8c61Eclipse, IntelliJ IDEA \u548cNetbeans\u7b49\u7b49)\u90fd\u63d0\u4f9b\u4e86\u6ce8\u89e3\u63a5\u53e3\u548c\u5c5e\u6027\u7684\u81ea\u52a8\u5b8c\u6210\u529f\u80fd. (\u8fd9\u4e9b\u4e0d\u9700\u8981IDE\u63d0\u4f9b\u7279\u522b\u7684EJB3\u652f\u6301\u6a21\u5757,\u56e0\u4e3aEJB3\u6ce8\u89e3\u662f\u6807\u51c6\u7684JDK5\u6ce8\u89e3)<\/p>\n<p>\u8bf7\u9605\u8bfbJBoss EJB 3.0\u6307\u5357\u6216\u8005\u76f4\u63a5\u9605\u8bfbHibernate Annotations\u6d4b\u8bd5\u4ee3\u7801\u4ee5\u83b7\u53d6\u66f4\u591a\u7684\u53ef\u8fd0\u884c\u5b9e\u4f8b.Hibernate Annotations\u63d0\u4f9b\u7684\u5927\u90e8\u5206\u5355\u5143\u6d4b\u8bd5\u4ee3\u7801\u90fd\u6f14\u793a\u4e86\u5b9e\u9645\u7684\u4f8b\u5b50,\u662f\u4e00\u4e2a\u83b7\u53d6\u7075\u611f\u7684\u597d\u5730\u65b9.<\/p>\n<h3><a name=\"d0e346\"><\/a>2.2.1.\u00a0\u58f0\u660e\u5b9e\u4f53bean<\/h3>\n<p>\u6bcf\u4e00\u4e2a\u6301\u4e45\u5316POJO\u7c7b\u90fd\u662f\u4e00\u4e2a\u5b9e\u4f53bean,\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5728\u7c7b\u7684\u5b9a\u4e49\u4e2d\u4f7f\u7528<tt>@Entity<\/tt>\u6ce8\u89e3\u6765\u8fdb\u884c\u58f0\u660e:<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Flight\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0Long\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Long\u00a0getId()\u00a0{\u00a0return\u00a0id;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setId(Long\u00a0id)\u00a0{\u00a0this.id\u00a0=\u00a0id;\u00a0}\u00a0}<\/pre>\n<p>\u901a\u8fc7<tt>@Entity<\/tt>\u6ce8\u89e3\u5c06\u4e00\u4e2a\u7c7b\u58f0\u660e\u4e3a\u4e00\u4e2a\u5b9e\u4f53bean(\u5373\u4e00\u4e2a\u6301\u4e45\u5316POJO\u7c7b),\u00a0<tt>@Id<\/tt>\u6ce8\u89e3\u5219\u58f0\u660e\u4e86\u8be5\u5b9e\u4f53bean\u7684\u6807\u8bc6\u5c5e\u6027. \u5176\u4ed6\u7684\u6620\u5c04\u5b9a\u4e49\u662f\u9690\u5f0f\u7684.\u8fd9\u79cd\u4ee5\u9690\u5f0f\u6620\u5c04\u4e3a\u4e3b\u4f53,\u4ee5\u663e\u5f0f\u6620\u5c04\u4e3a\u4f8b\u5916\u7684\u914d\u7f6e\u65b9\u5f0f\u5728\u65b0\u7684EJ3\u89c4\u8303\u4e2d\u5904\u4e8e\u975e\u5e38\u91cd\u8981\u7684\u4f4d\u7f6e, \u548c\u4ee5\u524d\u7684\u7248\u672c\u76f8\u6bd4\u6709\u4e86\u8d28\u7684\u98de\u8dc3. \u5728\u4e0a\u9762\u8fd9\u6bb5\u4ee3\u7801\u4e2d\uff1aFlight\u7c7b\u6620\u5c04\u5230Flight\u8868,\u5e76\u4f7f\u7528id\u5217\u4f5c\u4e3a\u4e3b\u952e\u5217.<\/p>\n<p>\u5728\u5bf9\u4e00\u4e2a\u7c7b\u8fdb\u884c\u6ce8\u89e3\u65f6,\u4f60\u53ef\u4ee5\u9009\u62e9\u5bf9\u5b83\u7684\u7684\u5c5e\u6027\u6216\u8005\u65b9\u6cd5\u8fdb\u884c\u6ce8\u89e3,\u6839\u636e\u4f60\u7684\u9009\u62e9,Hibernate\u7684\u8bbf\u95ee\u7c7b\u578b\u5206\u522b\u4e3a\u00a0<tt>field<\/tt>\u6216<tt>property<\/tt>. EJ3\u89c4\u8303\u8981\u6c42\u5728\u9700\u8981\u8bbf\u95ee\u7684\u5143\u7d20\u4e0a\u8fdb\u884c\u6ce8\u89e3\u58f0\u660e,\u4f8b\u5982,\u5982\u679c\u8bbf\u95ee\u7c7b\u578b\u4e3a\u00a0<tt>property<\/tt>\u5c31\u8981\u5728getter\u65b9\u6cd5\u4e0a\u8fdb\u884c\u6ce8\u89e3\u58f0\u660e, \u5982\u679c\u8bbf\u95ee\u7c7b\u578b\u4e3a<tt>field<\/tt>\u5c31\u8981\u5728\u5b57\u6bb5\u4e0a\u8fdb\u884c\u6ce8\u89e3\u58f0\u660e.\u5e94\u8be5\u5c3d\u91cf\u907f\u514d\u6df7\u5408\u4f7f\u7528\u8fd9\u4e24\u79cd\u8bbf\u95ee\u7c7b\u578b. Hibernate\u6839\u636e<tt>@Id<\/tt>\u00a0\u6216\u00a0<tt>@EmbeddedId<\/tt>\u7684\u4f4d\u7f6e\u6765\u5224\u65ad\u8bbf\u95ee\u7c7b\u578b.<\/p>\n<h4><a name=\"d0e384\"><\/a>2.2.1.1.\u00a0\u5b9a\u4e49\u8868(Table)<\/h4>\n<p><tt>@Table<\/tt>\u662f\u7c7b\u4e00\u7ea7\u7684\u6ce8\u89e3, \u901a\u8fc7<tt>@Table<\/tt>\u6ce8\u89e3\u53ef\u4ee5\u4e3a\u5b9e\u4f53bean\u6620\u5c04\u6307\u5b9a\u8868(table),\u76ee\u5f55(catalog)\u548cschema\u7684\u540d\u5b57. \u5982\u679c\u6ca1\u6709\u5b9a\u4e49<tt>@Table<\/tt>,\u90a3\u4e48\u7cfb\u7edf\u81ea\u52a8\u4f7f\u7528\u9ed8\u8ba4\u503c\uff1a\u5b9e\u4f53\u7684\u77ed\u7c7b\u540d(\u4e0d\u9644\u5e26\u5305\u540d).<\/p>\n<pre>@Entity\u00a0@Table(name=\"tbl_sky\")\u00a0public\u00a0class\u00a0Sky\u00a0implements\u00a0Serializable\u00a0{\u00a0...<\/pre>\n<p><tt>@Table<\/tt>\u5143\u7d20\u5305\u62ec\u4e86\u4e00\u4e2a<tt>schema<\/tt>\u00a0\u548c\u4e00\u4e2a\u00a0<tt>catalog<\/tt>\u5c5e\u6027,\u5982\u679c\u9700\u8981\u53ef\u4ee5\u6307\u5b9a\u76f8\u5e94\u7684\u503c. \u7ed3\u5408\u4f7f\u7528<tt>@UniqueConstraint<\/tt>\u6ce8\u89e3\u53ef\u4ee5\u5b9a\u4e49\u8868\u7684\u552f\u4e00\u7ea6\u675f(unique constraint) (\u5bf9\u4e8e\u7ed1\u5b9a\u5230\u5355\u5217\u7684\u552f\u4e00\u7ea6\u675f,\u8bf7\u53c2\u8003<tt>@Column<\/tt>\u6ce8\u89e3)<\/p>\n<pre>@Table(name=\"tbl_sky\",\u00a0\u00a0\u00a0\u00a0\u00a0uniqueConstraints\u00a0=\u00a0{@UniqueConstraint(columnNames={\"month\",\u00a0\"day\"})}\u00a0)<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,\u5728month\u548cday\u8fd9\u4e24\u4e2a\u5b57\u6bb5\u4e0a\u5b9a\u4e49\u552f\u4e00\u7ea6\u675f. \u6ce8\u610f<tt>columnNames<\/tt>\u6570\u7ec4\u4e2d\u7684\u503c\u6307\u7684\u662f\u903b\u8f91\u5217\u540d.<\/p>\n<p><em>Hibernate\u5728NamingStrategy\u7684\u5b9e\u73b0\u4e2d\u5b9a\u4e49\u4e86\u903b\u8f91\u5217\u540d. \u9ed8\u8ba4\u7684EJB3\u547d\u540d\u7b56\u7565\u5c06\u7269\u7406\u5b57\u6bb5\u540d\u5f53\u4f5c\u903b\u8f91\u5b57\u6bb5\u540d\u6765\u4f7f\u7528. \u6ce8\u610f\u8be5\u5b57\u6bb5\u540d\u548c\u5b83\u5bf9\u5e94\u7684\u5c5e\u6027\u540d\u53ef\u80fd\u4e0d\u540c(\u5982\u679c\u5b57\u6bb5\u540d\u662f\u663e\u5f0f\u6307\u5b9a\u7684\u8bdd). \u9664\u975e\u4f60\u91cd\u5199\u4e86NamingStrategy,\u5426\u5219\u4e0d\u7528\u62c5\u5fc3\u8fd9\u4e9b\u533a\u522b..<\/em><\/p>\n<h4><a name=\"d0e427\"><\/a>2.2.1.2.\u00a0\u4e50\u89c2\u9501\u5b9a\u7248\u672c\u63a7\u5236<\/h4>\n<p>\u4f60\u53ef\u4ee5\u5728\u5b9e\u4f53bean\u4e2d\u4f7f\u7528<tt>@Version<\/tt>\u6ce8\u89e3,\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f\u53ef\u6dfb\u52a0\u5bf9\u4e50\u89c2\u9501\u5b9a\u7684\u652f\u6301:<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Flight\u00a0implements\u00a0Serializable\u00a0{\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0@Version\u00a0\u00a0\u00a0\u00a0\u00a0@Column(name=\"OPTLOCK\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Integer\u00a0getVersion()\u00a0{\u00a0...\u00a0}\u00a0}<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,version\u5c5e\u6027\u5c06\u6620\u5c04\u5230\u00a0<tt>OPTLOCK<\/tt>\u5217, entity manager\u4f7f\u7528\u8be5\u5b57\u6bb5\u6765\u68c0\u6d4b\u66f4\u65b0\u51b2\u7a81(\u9632\u6b62\u66f4\u65b0\u4e22\u5931,\u8bf7\u53c2\u8003last-commit-wins\u7b56\u7565).<\/p>\n<p>\u6839\u636eEJB3\u89c4\u8303,version\u5217\u53ef\u4ee5\u662fnumeric\u7c7b\u578b(\u63a8\u8350\u65b9\u5f0f)\u4e5f\u53ef\u4ee5\u662ftimestamp\u7c7b\u578b. Hibernate\u652f\u6301\u4efb\u4f55\u81ea\u5b9a\u4e49\u7c7b\u578b,\u53ea\u8981\u8be5\u7c7b\u578b\u5b9e\u73b0\u4e86<tt>UserVersionType<\/tt>.<\/p>\n<h3><a name=\"d0e447\"><\/a>2.2.2.\u00a0\u6620\u5c04\u7b80\u5355\u5c5e\u6027<\/h3>\n<h4><a name=\"d0e450\"><\/a>2.2.2.1.\u00a0\u58f0\u660e\u57fa\u672c\u7684\u5c5e\u6027\u6620\u5c04<\/h4>\n<p>Every non static non transient property (field or method) of an entity bean is considered persistent, unless you annotate it as\u00a0<tt>@Transient<\/tt>. Not having an annotation for your property is equivalent to the appropriate\u00a0<tt>@Basic<\/tt>\u00a0annotation. The\u00a0<tt>@Basic<\/tt>\u00a0annotation allows you to declare the fetching strategy for a property:<\/p>\n<p>\u5b9e\u4f53bean\u4e2d\u6240\u6709\u7684\u975estatic\u975etransient\u7684\u5c5e\u6027\u90fd\u53ef\u4ee5\u88ab\u6301\u4e45\u5316, \u9664\u975e\u4f60\u5c06\u5176\u6ce8\u89e3\u4e3a<tt>@Transient<\/tt>.\u6240\u6709\u6ca1\u6709\u5b9a\u4e49\u6ce8\u89e3\u7684\u5c5e\u6027\u7b49\u4ef7\u4e8e\u5728\u5176\u4e0a\u9762\u6dfb\u52a0\u4e86@Basic\u6ce8\u89e3. \u901a\u8fc7\u00a0<tt>@Basic<\/tt>\u6ce8\u89e3\u53ef\u4ee5\u58f0\u660e\u5c5e\u6027\u7684\u83b7\u53d6\u7b56\u7565(fetch strategy)\uff1a<\/p>\n<pre>public\u00a0transient\u00a0int\u00a0counter;\u00a0\/\/transient\u00a0property\u00a0private\u00a0String\u00a0firstname;\u00a0\/\/persistent\u00a0property\u00a0@Transient\u00a0String\u00a0getLengthInMeter()\u00a0{\u00a0...\u00a0}\u00a0\/\/transient\u00a0property\u00a0String\u00a0getName()\u00a0{...\u00a0}\u00a0\/\/\u00a0persistent\u00a0property\u00a0@Basic\u00a0int\u00a0getLength()\u00a0{\u00a0...\u00a0}\u00a0\/\/\u00a0persistent\u00a0property\u00a0@Basic(fetch\u00a0=\u00a0FetchType.LAZY)\u00a0String\u00a0getDetailedComment()\u00a0{\u00a0...\u00a0}\u00a0\/\/\u00a0persistent\u00a0property\u00a0@Temporal(TemporalType.TIME)\u00a0java.util.Date\u00a0getDepartureTime()\u00a0{\u00a0...\u00a0}\u00a0\/\/\u00a0persistent\u00a0property\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Enumerated(EnumType.STRING)\u00a0Starred\u00a0getNote()\u00a0{\u00a0...\u00a0}\u00a0\/\/enum\u00a0persisted\u00a0as\u00a0String\u00a0in\u00a0database<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>counter<\/tt>\u662f\u4e00\u4e2atransient\u7684\u5b57\u6bb5,\u00a0<tt>lengthInMeter<\/tt>\u7684getter\u65b9\u6cd5\u88ab\u6ce8\u89e3\u4e3a<tt>@Transient<\/tt>, entity manager\u5c06\u5ffd\u7565\u8fd9\u4e9b\u5b57\u6bb5\u548c\u5c5e\u6027. \u800c<tt>name<\/tt>,<tt>length<\/tt>,<tt>firstname<\/tt>\u00a0\u8fd9\u51e0\u4e2a\u5c5e\u6027\u5219\u662f\u88ab\u5b9a\u4e49\u4e3a\u53ef\u6301\u4e45\u5316\u548c\u53ef\u83b7\u53d6\u7684.\u5bf9\u4e8e\u7b80\u5355\u5c5e\u6027\u6765\u8bf4,\u9ed8\u8ba4\u7684\u83b7\u53d6\u65b9\u5f0f\u662f\u5373\u65f6\u83b7\u53d6(early fetch). \u5f53\u4e00\u4e2a\u5b9e\u4f53Bean\u7684\u5b9e\u4f8b\u88ab\u521b\u5efa\u65f6,Hibernate\u4f1a\u5c06\u8fd9\u4e9b\u5c5e\u6027\u7684\u503c\u4ece\u6570\u636e\u5e93\u4e2d\u63d0\u53d6\u51fa\u6765,\u4fdd\u5b58\u5230Bean\u7684\u5c5e\u6027\u91cc. \u4e0e\u5373\u65f6\u83b7\u53d6\u76f8\u5bf9\u5e94\u7684\u662f\u5ef6\u8fdf\u83b7\u53d6(lazy fetch).\u5982\u679c\u4e00\u4e2a\u5c5e\u6027\u7684\u83b7\u53d6\u65b9\u5f0f\u662f\u5ef6\u8fdf\u83b7\u53d6 (\u6bd4\u5982\u4e0a\u9762\u4f8b\u5b50\u4e2d\u7684<tt>detailedComment<\/tt>\u5c5e\u6027), Hibernate\u5728\u521b\u5efa\u4e00\u4e2a\u5b9e\u4f53Bean\u7684\u5b9e\u4f8b\u65f6,\u4e0d\u4f1a\u5373\u65f6\u5c06\u8fd9\u4e2a\u5c5e\u6027\u7684\u503c\u4ece\u6570\u636e\u5e93\u4e2d\u8bfb\u51fa. \u53ea\u6709\u5728\u8be5\u5b9e\u4f53Bean\u7684\u8fd9\u4e2a\u5c5e\u6027\u7b2c\u4e00\u6b21\u88ab\u8c03\u7528\u65f6,Hibernate\u624d\u4f1a\u53bb\u83b7\u53d6\u5bf9\u5e94\u7684\u503c. \u901a\u5e38\u4f60\u4e0d\u9700\u8981\u5bf9\u7b80\u5355\u5c5e\u6027\u8bbe\u7f6e\u5ef6\u8fdf\u83b7\u53d6(lazy simple property),\u5343\u4e07\u4e0d\u8981\u548c\u5ef6\u8fdf\u5173\u8054\u83b7\u53d6(lazy association fetch)\u6df7\u6dc6\u4e86 (\u8bd1\u6ce8:\u8fd9\u91cc\u6307\u4e0d\u8981\u628alazy simple property\u548clazy association fetch\u6df7\u6dc6\u4e86).<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u4e3a\u4e86\u542f\u7528\u5c5e\u6027\u7ea7\u7684\u5ef6\u8fdf\u83b7\u53d6,\u4f60\u7684\u7c7b\u5fc5\u987b\u7ecf\u8fc7\u7279\u6b8a\u5904\u7406(instrumented)\uff1a \u5b57\u8282\u7801\u5c06\u88ab\u7ec7\u5165\u539f\u59cb\u7c7b\u4e2d\u6765\u5b9e\u73b0\u5ef6\u8fdf\u83b7\u53d6\u529f\u80fd, \u8be6\u60c5\u53c2\u8003Hibernate\u53c2\u8003\u6587\u6863.\u5982\u679c\u4e0d\u5bf9\u7c7b\u6587\u4ef6\u8fdb\u884c\u5b57\u8282\u7801\u7279\u6b8a\u5904\u7406, \u90a3\u4e48\u5c5e\u6027\u7ea7\u7684\u5ef6\u8fdf\u83b7\u53d6\u5c06\u88ab\u5ffd\u7565.<\/p>\n<p>\u63a8\u8350\u7684\u66ff\u4ee3\u65b9\u6848\u662f\u4f7f\u7528EJB-QL\u6216\u8005Criteria\u67e5\u8be2\u7684\u6295\u5f71(projection)\u529f\u80fd.<\/p>\n<p>Hibernate\u548cEJB3\u90fd\u652f\u6301\u6240\u6709\u57fa\u672c\u7c7b\u578b\u7684\u5c5e\u6027\u6620\u5c04. \u8fd9\u4e9b\u57fa\u672c\u7c7b\u578b\u5305\u62ec\u6240\u6709\u7684Java\u57fa\u672c\u7c7b\u578b,\u53ca\u5176\u5404\u81ea\u7684wrapper\u7c7b\u548cserializable\u7c7b. Hibernate Annotations\u8fd8\u652f\u6301\u5c06\u5185\u7f6e\u7684\u679a\u4e3e\u7c7b\u578b\u6620\u5c04\u5230\u4e00\u4e2a\u987a\u5e8f\u5217(\u4fdd\u5b58\u4e86\u76f8\u5e94\u7684\u5e8f\u5217\u503c) \u6216\u4e00\u4e2a\u5b57\u7b26\u4e32\u7c7b\u578b\u7684\u5217(\u4fdd\u5b58\u76f8\u5e94\u7684\u5b57\u7b26\u4e32).\u9ed8\u8ba4\u662f\u4fdd\u5b58\u679a\u4e3e\u7684\u5e8f\u5217\u503c, \u4f46\u662f\u4f60\u53ef\u4ee5\u901a\u8fc7<tt>@Enumerated<\/tt>\u6ce8\u89e3\u6765\u8fdb\u884c\u8c03\u6574(\u89c1\u4e0a\u9762\u4f8b\u5b50\u4e2d\u7684note\u5c5e\u6027).<\/p>\n<p>\u5728\u6838\u5fc3\u7684Java API\u4e2d\u5e76\u6ca1\u6709\u5b9a\u4e49\u65f6\u95f4\u7cbe\u5ea6(temporal precision). \u56e0\u6b64\u5904\u7406\u65f6\u95f4\u7c7b\u578b\u6570\u636e\u65f6,\u4f60\u8fd8\u9700\u8981\u5b9a\u4e49\u5c06\u5176\u5b58\u50a8\u5728\u6570\u636e\u5e93\u4e2d\u6240\u9884\u671f\u7684\u7cbe\u5ea6. \u5728\u6570\u636e\u5e93\u4e2d,\u8868\u793a\u65f6\u95f4\u7c7b\u578b\u7684\u6570\u636e\u6709<tt>DATE<\/tt>,\u00a0<tt>TIME<\/tt>, \u548c\u00a0<tt>TIMESTAMP<\/tt>\u4e09\u79cd\u7cbe\u5ea6(\u5373\u5355\u7eaf\u7684\u65e5\u671f,\u65f6\u95f4,\u6216\u8005\u4e24\u8005\u517c\u5907). \u53ef\u4f7f\u7528<tt>@Temporal<\/tt>\u6ce8\u89e3\u6765\u8c03\u6574\u7cbe\u5ea6.<\/p>\n<p><tt>@Lob<\/tt>\u6ce8\u89e3\u8868\u793a\u5c5e\u6027\u5c06\u88ab\u6301\u4e45\u5316\u4e3aBlob\u6216\u8005Clob\u7c7b\u578b, \u5177\u4f53\u53d6\u51b3\u4e8e\u5c5e\u6027\u7684\u7c7b\u578b,\u00a0<tt>java.sql.Clob<\/tt>,\u00a0<tt>Character[]<\/tt>,\u00a0<tt>char[]<\/tt>\u00a0\u548c\u00a0<tt>java.lang.String<\/tt>\u8fd9\u4e9b\u7c7b\u578b\u7684\u5c5e\u6027\u90fd\u88ab\u6301\u4e45\u5316\u4e3aClob\u7c7b\u578b, \u800c<tt>java.sql.Blob<\/tt>,\u00a0<tt>Byte[]<\/tt>,\u00a0<tt>byte[]<\/tt>\u00a0\u548c serializable\u7c7b\u578b\u5219\u88ab\u6301\u4e45\u5316\u4e3aBlob\u7c7b\u578b.<\/p>\n<pre>@Lob\u00a0public\u00a0String\u00a0getFullText()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0fullText;\u00a0}\u00a0@Lob\u00a0\u00a0public\u00a0byte[]\u00a0getFullCode()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0fullCode;\u00a0}<\/pre>\n<p>\u5982\u679c\u67d0\u4e2a\u5c5e\u6027\u5b9e\u73b0\u4e86<tt>java.io.Serializable<\/tt>\u540c\u65f6\u4e5f\u4e0d\u662f\u57fa\u672c\u7c7b\u578b, \u5e76\u4e14\u6ca1\u6709\u5728\u8be5\u5c5e\u6027\u4e0a\u4f7f\u7528<tt>@Lob<\/tt>\u6ce8\u89e3, \u90a3\u4e48Hibernate\u5c06\u4f7f\u7528\u81ea\u5e26\u7684<tt>serializable<\/tt>\u7c7b\u578b.<\/p>\n<h4><a name=\"d0e559\"><\/a>2.2.2.2.\u00a0\u58f0\u660e\u5217\u5c5e\u6027<\/h4>\n<p>\u4f7f\u7528\u00a0<tt>@Column\u00a0<\/tt>\u6ce8\u89e3\u53ef\u5c06\u5c5e\u6027\u6620\u5c04\u5230\u5217. \u4f7f\u7528\u8be5\u6ce8\u89e3\u6765\u8986\u76d6\u9ed8\u8ba4\u503c(\u5173\u4e8e\u9ed8\u8ba4\u503c\u8bf7\u53c2\u8003EJB3\u89c4\u8303). \u5728\u5c5e\u6027\u7ea7\u4f7f\u7528\u8be5\u6ce8\u89e3\u7684\u65b9\u5f0f\u5982\u4e0b\uff1a<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u4e0d\u8fdb\u884c\u6ce8\u89e3<\/li>\n<li>\u548c\u00a0<tt>@Basic<\/tt>\u4e00\u8d77\u4f7f\u7528<\/li>\n<li>\u548c\u00a0<tt>@Version<\/tt>\u4e00\u8d77\u4f7f\u7528<\/li>\n<li>\u548c\u00a0<tt>@Lob<\/tt>\u4e00\u8d77\u4f7f\u7528<\/li>\n<li>\u548c\u00a0<tt>@Temporal<\/tt>\u4e00\u8d77\u4f7f\u7528<\/li>\n<li>\u548c\u00a0<tt>@org.hibernate.annotations.CollectionOfElements<\/tt>\u4e00\u8d77\u4f7f\u7528 (\u53ea\u9488\u5bf9Hibernate )<\/li>\n<\/ul>\n<pre>@Entity\u00a0public\u00a0class\u00a0Flight\u00a0implements\u00a0Serializable\u00a0{\u00a0...\u00a0@Column(updatable\u00a0=\u00a0false,\u00a0name\u00a0=\u00a0\"flight_name\",\u00a0nullable\u00a0=\u00a0false,\u00a0length=50)\u00a0public\u00a0String\u00a0getName()\u00a0{\u00a0...\u00a0}<\/pre>\n<p>\u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>name<\/tt>\u5c5e\u6027\u6620\u5c04\u5230<tt>flight_name<\/tt>\u5217. \u8be5\u5b57\u6bb5\u4e0d\u5141\u8bb8\u4e3a\u7a7a,\u957f\u5ea6\u4e3a50,\u5e76\u4e14\u662f\u4e0d\u53ef\u66f4\u65b0\u7684(\u4e5f\u5c31\u662f\u5c5e\u6027\u503c\u662f\u4e0d\u53d8\u7684).<\/p>\n<p>\u4e0a\u9762\u8fd9\u4e9b\u6ce8\u89e3\u53ef\u4ee5\u88ab\u5e94\u7528\u5230\u6b63\u89c4\u5c5e\u6027\u4e0a\u4f8b\u5982<tt>@Id<\/tt>\u00a0\u6216<tt>@Version<\/tt>\u5c5e\u6027.<\/p>\n<pre>@Column(\u00a0\u00a0\u00a0\u00a0\u00a0name=\"columnName\";\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(1)\u00a0\u00a0\u00a0\u00a0\u00a0boolean\u00a0unique()\u00a0default\u00a0false;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(2)\u00a0\u00a0\u00a0\u00a0\u00a0boolean\u00a0nullable()\u00a0default\u00a0true;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(3)\u00a0\u00a0\u00a0\u00a0\u00a0boolean\u00a0insertable()\u00a0default\u00a0true;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(4)\u00a0\u00a0\u00a0\u00a0\u00a0boolean\u00a0updatable()\u00a0default\u00a0true;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(5)\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0columnDefinition()\u00a0default\u00a0\"\";\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(6)\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0table()\u00a0default\u00a0\"\";\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(7)\u00a0\u00a0\u00a0\u00a0\u00a0int\u00a0length()\u00a0default\u00a0255;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(8)\u00a0\u00a0\u00a0\u00a0\u00a0int\u00a0precision()\u00a0default\u00a00;\u00a0\/\/\u00a0decimal\u00a0precision\u00a0\u00a0\u00a0(9)\u00a0\u00a0\u00a0\u00a0\u00a0int\u00a0scale()\u00a0default\u00a00;\u00a0\/\/\u00a0decimal\u00a0scale<\/pre>\n<table summary=\"Callout list\">\n<tbody>\n<tr class=\"firstRow\">\n<td valign=\"top\" width=\"5%\">(1)<\/td>\n<td valign=\"top\"><tt>name<\/tt>\u00a0\u53ef\u9009,\u5217\u540d(\u9ed8\u8ba4\u503c\u662f\u5c5e\u6027\u540d)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(2)<\/td>\n<td valign=\"top\"><tt>unique<\/tt>\u00a0\u53ef\u9009,\u662f\u5426\u5728\u8be5\u5217\u4e0a\u8bbe\u7f6e\u552f\u4e00\u7ea6\u675f(\u9ed8\u8ba4\u503cfalse)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(3)<\/td>\n<td valign=\"top\"><tt>nullable<\/tt>\u00a0\u53ef\u9009,\u662f\u5426\u8bbe\u7f6e\u8be5\u5217\u7684\u503c\u53ef\u4ee5\u4e3a\u7a7a(\u9ed8\u8ba4\u503cfalse)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(4)<\/td>\n<td valign=\"top\"><tt>insertable<\/tt>\u00a0\u53ef\u9009,\u8be5\u5217\u662f\u5426\u4f5c\u4e3a\u751f\u6210\u7684insert\u8bed\u53e5\u4e2d\u7684\u4e00\u4e2a\u5217(\u9ed8\u8ba4\u503ctrue)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(5)<\/td>\n<td valign=\"top\"><tt>updatable<\/tt>\u00a0\u53ef\u9009,\u8be5\u5217\u662f\u5426\u4f5c\u4e3a\u751f\u6210\u7684update\u8bed\u53e5\u4e2d\u7684\u4e00\u4e2a\u5217(\u9ed8\u8ba4\u503ctrue)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(6)<\/td>\n<td valign=\"top\"><tt>columnDefinition<\/tt>\u00a0\u53ef\u9009: \u4e3a\u8fd9\u4e2a\u7279\u5b9a\u5217\u8986\u76d6SQL DDL\u7247\u6bb5 (\u8fd9\u53ef\u80fd\u5bfc\u81f4\u65e0\u6cd5\u5728\u4e0d\u540c\u6570\u636e\u5e93\u95f4\u79fb\u690d)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(7)<\/td>\n<td valign=\"top\"><tt>table<\/tt>\u00a0\u53ef\u9009,\u5b9a\u4e49\u5bf9\u5e94\u7684\u8868(\u9ed8\u8ba4\u4e3a\u4e3b\u8868)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(8)<\/td>\n<td valign=\"top\"><tt><tt>length<\/tt><\/tt>\u00a0\u53ef\u9009,\u5217\u957f\u5ea6(\u9ed8\u8ba4\u503c255)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(8)<\/td>\n<td valign=\"top\"><tt><tt>precision<\/tt><\/tt>\u00a0\u53ef\u9009,\u5217\u5341\u8fdb\u5236\u7cbe\u5ea6(decimal precision)(\u9ed8\u8ba4\u503c0)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(10)<\/td>\n<td valign=\"top\"><tt><tt>scale<\/tt><\/tt>\u00a0\u53ef\u9009,\u5982\u679c\u5217\u5341\u8fdb\u5236\u6570\u503c\u8303\u56f4(decimal scale)\u53ef\u7528,\u5728\u6b64\u8bbe\u7f6e(\u9ed8\u8ba4\u503c0)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4><a name=\"d0e687\"><\/a>2.2.2.3.\u00a0\u5d4c\u5165\u5f0f\u5bf9\u8c61(\u53c8\u540d\u7ec4\u4ef6)<\/h4>\n<p>\u5728\u5b9e\u4f53\u4e2d\u53ef\u4ee5\u5b9a\u4e49\u4e00\u4e2a\u5d4c\u5165\u5f0f\u7ec4\u4ef6(embedded component), \u751a\u81f3\u8986\u76d6\u8be5\u5b9e\u4f53\u4e2d\u539f\u6709\u7684\u5217\u6620\u5c04. \u7ec4\u4ef6\u7c7b\u5fc5\u987b\u5728\u7c7b\u4e00\u7ea7\u5b9a\u4e49<tt>@Embeddable<\/tt>\u6ce8\u89e3. \u5728\u7279\u5b9a\u7684\u5b9e\u4f53\u7684\u5173\u8054\u5c5e\u6027\u4e0a\u4f7f\u7528<tt>@Embedded<\/tt>\u548c\u00a0<tt>@AttributeOverride<\/tt>\u6ce8\u89e3\u53ef\u4ee5\u8986\u76d6\u8be5\u5c5e\u6027\u5bf9\u5e94\u7684\u5d4c\u5165\u5f0f\u5bf9\u8c61\u7684\u5217\u6620\u5c04\uff1a<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Person\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0Persistent\u00a0component\u00a0using\u00a0defaults\u00a0\u00a0\u00a0\u00a0\u00a0Address\u00a0homeAddress;\u00a0\u00a0\u00a0\u00a0\u00a0@Embedded\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverrides(\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverride(name=\"iso2\",\u00a0column\u00a0=\u00a0@Column(name=\"bornIso2\")\u00a0),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverride(name=\"name\",\u00a0column\u00a0=\u00a0@Column(name=\"bornCountryName\")\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0Country\u00a0bornIn;\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<pre>@Embeddable\u00a0public\u00a0class\u00a0Address\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0city;\u00a0\u00a0\u00a0\u00a0\u00a0Country\u00a0nationality;\u00a0\/\/no\u00a0overriding\u00a0here\u00a0}<\/pre>\n<pre>@Embeddable\u00a0public\u00a0class\u00a0Country\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0iso2;\u00a0\u00a0\u00a0\u00a0\u00a0@Column(name=\"countryName\")\u00a0private\u00a0String\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getIso2()\u00a0{\u00a0return\u00a0iso2;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setIso2(String\u00a0iso2)\u00a0{\u00a0this.iso2\u00a0=\u00a0iso2;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getName()\u00a0{\u00a0return\u00a0name;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setName(String\u00a0name)\u00a0{\u00a0this.name\u00a0=\u00a0name;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u5d4c\u5165\u5f0f\u5bf9\u8c61\u7ee7\u627f\u5176\u6240\u5c5e\u5b9e\u4f53\u4e2d\u5b9a\u4e49\u7684\u8bbf\u95ee\u7c7b\u578b (\u6ce8\u610f:\u8fd9\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528Hibernate\u63d0\u4f9b\u7684<tt>@AccessType<\/tt>\u6ce8\u89e3\u6765\u8986\u76d6\u539f\u6709\u503c)(\u8bf7\u53c2\u8003\u00a0<a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec\">Hibernate Annotation Extensions<\/a>).<\/p>\n<p>\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d,\u5b9e\u4f53bean\u00a0<tt>Person<\/tt>\u00a0\u6709\u4e24\u4e2a\u7ec4\u4ef6\u5c5e\u6027, \u5206\u522b\u662f<tt>homeAddress<\/tt>\u548c<tt>bornIn<\/tt>. \u6211\u4eec\u53ef\u4ee5\u770b\u5230<tt>homeAddress<\/tt>\u00a0\u5c5e\u6027\u5e76\u6ca1\u6709\u6ce8\u89e3. \u4f46\u662fHibernate\u81ea\u52a8\u68c0\u6d4b\u5176\u5bf9\u5e94\u7684Address\u7c7b\u4e2d\u7684<tt>@Embeddable<\/tt>\u6ce8\u89e3, \u5e76\u5c06\u5176\u770b\u4f5c\u4e00\u4e2a\u6301\u4e45\u5316\u7ec4\u4ef6.\u5bf9\u4e8eCountry\u4e2d\u5df2\u6620\u5c04\u7684\u5c5e\u6027, \u5219\u4f7f\u7528<tt>@Embedded<\/tt>\u548c<tt>@AttributeOverride\u00a0<\/tt>\u6ce8\u89e3\u6765\u8986\u76d6\u539f\u6765\u6620\u5c04\u7684\u5217\u540d. \u6b63\u5982\u4f60\u6240\u770b\u5230\u7684,\u00a0<tt>Address<\/tt>\u5bf9\u8c61\u4e2d\u8fd8\u5185\u5d4c\u4e86<tt>Country<\/tt>\u5bf9\u8c61, \u8fd9\u91cc\u548c<tt>homeAddress<\/tt>\u4e00\u6837\u4f7f\u7528\u4e86Hibernate\u548cEJB3\u81ea\u52a8\u68c0\u6d4b\u673a\u5236. \u76ee\u524dEJB3\u89c4\u8303\u8fd8\u4e0d\u652f\u6301\u8986\u76d6\u591a\u5c42\u5d4c\u5957(\u5373\u5d4c\u5165\u5f0f\u5bf9\u8c61\u4e2d\u8fd8\u5305\u62ec\u5176\u4ed6\u5d4c\u5165\u5f0f\u5bf9\u8c61)\u7684\u5217\u6620\u5c04. \u4e0d\u8fc7Hibernate\u901a\u8fc7\u5728\u8868\u8fbe\u5f0f\u4e2d\u4f7f\u7528&#8221;.&#8221;\u7b26\u53f7\u8868\u8fbe\u5f0f\u63d0\u4f9b\u4e86\u5bf9\u6b64\u7279\u5f81\u7684\u652f\u6301.<\/p>\n<pre>\u00a0\u00a0\u00a0\u00a0@Embedded\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverrides(\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverride(name=\"city\",\u00a0column\u00a0=\u00a0@Column(name=\"fld_city\")\u00a0),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverride(name=\"nationality.iso2\",\u00a0column\u00a0=\u00a0@Column(name=\"nat_Iso2\")\u00a0),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverride(name=\"nationality.name\",\u00a0column\u00a0=\u00a0@Column(name=\"nat_CountryName\")\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/nationality\u00a0columns\u00a0in\u00a0homeAddress\u00a0are\u00a0overridden\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0Address\u00a0homeAddress;<\/pre>\n<p>Hibernate\u6ce8\u89e3\u652f\u6301\u5f88\u591aEJB3\u89c4\u8303\u4e2d\u6ca1\u6709\u660e\u786e\u5b9a\u4e49\u7684\u7279\u6027. \u4f8b\u5982,\u53ef\u4ee5\u5728\u5d4c\u5165\u5f0f\u5bf9\u8c61\u4e0a\u6dfb\u52a0\u00a0<tt>@MappedSuperclass<\/tt>\u6ce8\u89e3, \u8fd9\u6837\u53ef\u4ee5\u5c06\u5176\u7236\u7c7b\u7684\u5c5e\u6027\u6301\u4e45(\u8be6\u60c5\u8bf7\u67e5\u9605<tt>@MappedSuperclass<\/tt>).<\/p>\n<p>Hibernate\u73b0\u5728\u652f\u6301\u5728\u5d4c\u5165\u5f0f\u5bf9\u8c61\u4e2d\u4f7f\u7528\u5173\u8054\u6ce8\u89e3(\u5982<tt>@*ToOne<\/tt>\u548c<tt>@*ToMany<\/tt>). \u800cEJB3\u89c4\u8303\u5c1a\u4e0d\u652f\u6301\u8fd9\u6837\u7684\u7528\u6cd5\u3002\u4f60\u53ef\u4ee5\u4f7f\u7528\u00a0<tt>@AssociationOverride<\/tt>\u6ce8\u89e3\u6765\u8986\u5199\u5173\u8054\u5217.<\/p>\n<p>\u5728\u540c\u4e00\u4e2a\u5b9e\u4f53\u4e2d\u4f7f\u7528\u4e24\u4e2a\u540c\u7c7b\u578b\u7684\u5d4c\u5165\u5bf9\u8c61, \u5176\u9ed8\u8ba4\u5217\u540d\u662f\u65e0\u6548\u7684:\u81f3\u5c11\u8981\u5bf9\u5176\u4e2d\u4e00\u4e2a\u8fdb\u884c\u660e\u786e\u58f0\u660e. Hibernate\u5728\u8fd9\u65b9\u9762\u8d70\u5728\u4e86EJB3\u89c4\u8303\u7684\u524d\u9762, Hibernate\u63d0\u4f9b\u4e86<tt>NamingStrategy<\/tt>, \u5728\u4f7f\u7528Hibernate\u65f6, \u901a\u8fc7<tt>NamingStrategy<\/tt>\u4f60\u53ef\u4ee5\u5bf9\u9ed8\u8ba4\u7684\u673a\u5236\u8fdb\u884c\u6269\u5c55.<tt>DefaultComponentSafeNamingStrategy<\/tt>\u00a0\u5728\u9ed8\u8ba4\u7684EJB3NamingStrategy\u4e0a\u8fdb\u884c\u4e86\u5c0f\u5c0f\u7684\u63d0\u5347, \u5141\u8bb8\u5728\u540c\u4e00\u5b9e\u4f53\u4e2d\u4f7f\u7528\u4e24\u4e2a\u540c\u7c7b\u578b\u7684\u5d4c\u5165\u5bf9\u8c61\u800c\u65e0\u987b\u989d\u5916\u7684\u58f0\u660e.<\/p>\n<h4><a name=\"d0e784\"><\/a>2.2.2.4.\u00a0\u65e0\u6ce8\u89e3\u4e4b\u5c5e\u6027\u7684\u9ed8\u8ba4\u503c<\/h4>\n<p>\u5982\u679c\u67d0\u5c5e\u6027\u6ca1\u6709\u6ce8\u89e3,\u8be5\u5c5e\u6027\u5c06\u9075\u5b88\u4e0b\u9762\u7684\u89c4\u5219:<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u5982\u679c\u5c5e\u6027\u4e3a\u5355\u4e00\u7c7b\u578b,\u5219\u6620\u5c04\u4e3a@Basic<\/li>\n<li>\u5426\u5219,\u5982\u679c\u5c5e\u6027\u5bf9\u5e94\u7684\u7c7b\u578b\u5b9a\u4e49\u4e86@Embeddable\u6ce8\u89e3,\u5219\u6620\u5c04\u4e3a@Embedded<\/li>\n<li>\u5426\u5219,\u5982\u679c\u5c5e\u6027\u5bf9\u5e94\u7684\u7c7b\u578b\u5b9e\u73b0\u4e86Serializable, \u5219\u5c5e\u6027\u88ab\u6620\u5c04\u4e3a@Basic\u5e76\u5728\u4e00\u4e2a\u5217\u4e2d\u4fdd\u5b58\u8be5\u5bf9\u8c61\u7684serialized\u7248\u672c<\/li>\n<li>\u5426\u5219,\u5982\u679c\u8be5\u5c5e\u6027\u7684\u7c7b\u578b\u4e3ajava.sql.Clob \u6216 java.sql.Blob,\u5219\u4f5c\u4e3a@Lob\u5e76\u6620\u5c04\u5230\u9002\u5f53\u7684LobType.<\/li>\n<\/ul>\n<h3><a name=\"mapping-identifier\"><\/a>2.2..\u00a0\u6620\u5c04\u4e3b\u952e\u5c5e\u6027<\/h3>\n<p>\u4f7f\u7528<tt>@Id<\/tt>\u6ce8\u89e3\u53ef\u4ee5\u5c06\u5b9e\u4f53bean\u4e2d\u7684\u67d0\u4e2a\u5c5e\u6027\u5b9a\u4e49\u4e3a\u6807\u8bc6\u7b26(identifier). \u8be5\u5c5e\u6027\u7684\u503c\u53ef\u4ee5\u901a\u8fc7\u5e94\u7528\u81ea\u8eab\u8fdb\u884c\u8bbe\u7f6e, \u4e5f\u53ef\u4ee5\u901a\u8fc7Hiberante\u751f\u6210(\u63a8\u8350). \u4f7f\u7528\u00a0<tt>@GeneratedValue<\/tt>\u6ce8\u89e3\u53ef\u4ee5\u5b9a\u4e49\u8be5\u6807\u8bc6\u7b26\u7684\u751f\u6210\u7b56\u7565:<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>AUTO &#8211; \u53ef\u4ee5\u662fidentity column\u7c7b\u578b,\u6216\u8005sequence\u7c7b\u578b\u6216\u8005table\u7c7b\u578b,\u53d6\u51b3\u4e8e\u4e0d\u540c\u7684\u5e95\u5c42\u6570\u636e\u5e93.<\/li>\n<li>TABLE &#8211; \u4f7f\u7528\u8868\u4fdd\u5b58id\u503c<\/li>\n<li>IDENTITY &#8211; identity column<\/li>\n<li>SEQUENCE &#8211; sequence<\/li>\n<\/ul>\n<p>\u548cEJB3\u89c4\u8303\u76f8\u6bd4,Hibernate\u63d0\u4f9b\u4e86\u66f4\u591a\u7684id\u751f\u6210\u5668.\u8be6\u60c5\u8bf7\u67e5\u9605\u00a0<a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec\">Hibernate Annotation Extensions<\/a>\u00a0.<\/p>\n<p>\u4e0b\u9762\u7684\u4f8b\u5b50\u5c55\u793a\u4e86\u4f7f\u7528SEQ_STORE\u914d\u7f6e\u7684sequence\u751f\u6210\u5668<\/p>\n<pre>@Id\u00a0@GeneratedValue(strategy=GenerationType.SEQUENCE,\u00a0generator=\"SEQ_STORE\")\u00a0public\u00a0Integer\u00a0getId()\u00a0{\u00a0...\u00a0}<\/pre>\n<p>\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4f7f\u7528\u7684\u662fidentity\u751f\u6210\u5668<\/p>\n<pre>@Id\u00a0@GeneratedValue(strategy=GenerationType.IDENTITY)\u00a0public\u00a0Long\u00a0getId()\u00a0{\u00a0...\u00a0}<\/pre>\n<p><tt>AUTO<\/tt>\u751f\u6210\u5668\u9002\u7528\u4e8e\u53ef\u79fb\u690d\u7684\u5e94\u7528(\u5728\u591a\u4e2aDB\u95f4\u5207\u6362). \u591a\u4e2a<tt>@Id<\/tt>\u53ef\u4ee5\u5171\u4eab\u540c\u4e00\u4e2aidentifier\u751f\u6210\u5668,\u53ea\u8981\u628agenerator\u5c5e\u6027\u8bbe\u6210\u76f8\u540c\u7684\u503c\u5c31\u53ef\u4ee5\u4e86. \u901a\u8fc7<tt>@SequenceGenerator<\/tt>\u00a0\u548c<tt>@TableGenerator<\/tt>,\u4f60\u53ef\u4ee5\u914d\u7f6e\u4e0d\u540c\u7684identifier\u751f\u6210\u5668. \u6bcf\u4e00\u4e2aidentifier\u751f\u6210\u5668\u90fd\u6709\u81ea\u5df1\u7684\u9002\u7528\u8303\u56f4,\u53ef\u4ee5\u662f\u5e94\u7528\u7ea7(application level)\u548c\u7c7b\u4e00\u7ea7(class level). \u7c7b\u4e00\u7ea7\u7684\u751f\u6210\u5668\u5728\u5916\u90e8\u662f\u4e0d\u53ef\u89c1\u7684, \u800c\u4e14\u7c7b\u4e00\u7ea7\u7684\u751f\u6210\u5668\u53ef\u4ee5\u8986\u76d6\u5e94\u7528\u7ea7\u7684\u751f\u6210\u5668. \u5e94\u7528\u7ea7\u7684\u751f\u6210\u5668\u5219\u5b9a\u4e49\u5728\u5305\u4e00\u7ea7(package level)(\u5982<tt>package-info.java<\/tt>):<\/p>\n<pre>@javax.persistence.TableGenerator(\u00a0\u00a0\u00a0\u00a0\u00a0name=\"EMP_GEN\",\u00a0\u00a0\u00a0\u00a0\u00a0table=\"GENERATOR_TABLE\",\u00a0\u00a0\u00a0\u00a0\u00a0pkColumnName\u00a0=\u00a0\"key\",\u00a0\u00a0\u00a0\u00a0\u00a0valueColumnName\u00a0=\u00a0\"hi\"\u00a0\u00a0\u00a0\u00a0\u00a0pkColumnValue=\"EMP\",\u00a0\u00a0\u00a0\u00a0\u00a0allocationSize=20\u00a0)\u00a0@javax.persistence.SequenceGenerator(\u00a0\u00a0\u00a0\u00a0\u00a0name=\"SEQ_GEN\",\u00a0\u00a0\u00a0\u00a0\u00a0sequenceName=\"my_sequence\"\u00a0)\u00a0package\u00a0org.hibernate.test.metadata;<\/pre>\n<p>\u5982\u679c\u5728<tt>org.hibernate.test.metadata<\/tt>\u5305\u4e0b\u9762\u7684\u00a0<tt>package-info.java<\/tt>\u6587\u4ef6\u7528\u4e8e\u521d\u59cb\u5316EJB\u914d\u7f6e, \u90a3\u4e48\u8be5\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7684\u00a0<tt>EMP_GEN<\/tt>\u00a0\u548c<tt>SEQ_GEN<\/tt>\u90fd\u662f\u5e94\u7528\u7ea7\u7684\u751f\u6210\u5668.\u00a0<tt>EMP_GEN<\/tt>\u5b9a\u4e49\u4e86\u4e00\u4e2a\u4f7f\u7528hilo\u7b97\u6cd5 (max_lo\u4e3a20)\u7684id\u751f\u6210\u5668(\u8be5\u751f\u6210\u5668\u5c06id\u7684\u4fe1\u606f\u5b58\u5728\u6570\u636e\u5e93\u7684\u67d0\u4e2a\u8868\u4e2d.). id\u7684hi\u503c\u4fdd\u5b58\u5728<tt>GENERATOR_TABLE<\/tt>\u4e2d. \u5728\u8be5\u8868\u4e2d\u00a0<tt>pkColumnName<\/tt>&#8220;key&#8221;\u7b49\u4ef7\u4e8e\u00a0<tt>pkColumnValue<\/tt>\u00a0&#8220;<tt>EMP<\/tt>&#8220;, \u800c<tt>valueColumnName<\/tt>\u00a0&#8220;<tt>hi<\/tt>&#8220;\u4e2d\u5b58\u50a8\u7684\u662f\u4e0b\u4e00\u4e2a\u8981\u4f7f\u7528\u7684\u6700\u5927\u503c.<\/p>\n<p><tt>SEQ_GEN<\/tt>\u5219\u5b9a\u4e49\u4e86\u4e00\u4e2asequence \u751f\u6210\u5668, \u5176\u5bf9\u5e94\u7684sequence\u540d\u4e3a\u00a0<tt>my_sequence<\/tt>. \u6ce8\u610f\u76ee\u524dHibernate Annotations\u8fd8\u4e0d\u652f\u6301sequence \u751f\u6210\u5668\u4e2d\u7684\u00a0<tt>initialValue<\/tt>\u548c\u00a0<tt>allocationSize<\/tt>\u53c2\u6570.<\/p>\n<p>\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\u5c55\u793a\u4e86\u5b9a\u4e49\u5728\u7c7b\u8303\u56f4(class scope)\u7684sequence\u751f\u6210\u5668:<\/p>\n<pre>@Entity\u00a0@javax.persistence.SequenceGenerator(\u00a0\u00a0\u00a0\u00a0\u00a0name=\"SEQ_STORE\",\u00a0\u00a0\u00a0\u00a0\u00a0sequenceName=\"my_sequence\"\u00a0)\u00a0public\u00a0class\u00a0Store\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Long\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0@GeneratedValue(strategy=GenerationType.SEQUENCE,\u00a0generator=\"SEQ_STORE\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Long\u00a0getId()\u00a0{\u00a0return\u00a0id;\u00a0}\u00a0}<\/pre>\n<p>\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,Store\u7c7b\u4f7f\u7528\u540d\u4e3amy_sequence\u7684sequence,\u5e76\u4e14SEQ_STORE \u751f\u6210\u5668\u5bf9\u4e8e\u5176\u4ed6\u7c7b\u662f\u4e0d\u53ef\u89c1\u7684. \u6ce8\u610f\u5728org.hibernate.test.metadata.id\u5305\u4e0b\u7684\u6d4b\u8bd5\u4ee3\u7801\u6709\u66f4\u591a\u6f14\u793aHibernate Annotations\u7528\u6cd5\u7684\u4f8b\u5b50..<\/p>\n<p>\u4e0b\u9762\u662f\u5b9a\u4e49\u7ec4\u5408\u4e3b\u952e\u7684\u51e0\u79cd\u8bed\u6cd5:<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u5c06\u7ec4\u4ef6\u7c7b\u6ce8\u89e3\u4e3a@Embeddable,\u5e76\u5c06\u7ec4\u4ef6\u7684\u5c5e\u6027\u6ce8\u89e3\u4e3a@Id<\/li>\n<li>\u5c06\u7ec4\u4ef6\u7684\u5c5e\u6027\u6ce8\u89e3\u4e3a@EmbeddedId<\/li>\n<li>\u5c06\u7c7b\u6ce8\u89e3\u4e3a@IdClass,\u5e76\u5c06\u8be5\u5b9e\u4f53\u4e2d\u6240\u6709\u5c5e\u4e8e\u4e3b\u952e\u7684\u5c5e\u6027\u90fd\u6ce8\u89e3\u4e3a@Id<\/li>\n<\/ul>\n<p>\u5bf9\u4e8eEJB2\u7684\u5f00\u53d1\u4eba\u5458\u6765\u8bf4\u00a0<tt>@IdClass<\/tt>\u662f\u5f88\u5e38\u89c1\u7684, \u4f46\u662f\u5bf9\u4e8eHibernate\u7684\u7528\u6237\u6765\u8bf4\u5c31\u662f\u4e00\u4e2a\u5d2d\u65b0\u7684\u7528\u6cd5. \u7ec4\u5408\u4e3b\u952e\u7c7b\u5bf9\u5e94\u4e86\u4e00\u4e2a\u5b9e\u4f53\u7c7b\u4e2d\u7684\u591a\u4e2a\u5b57\u6bb5\u6216\u5c5e\u6027, \u800c\u4e14\u4e3b\u952e\u7c7b\u4e2d\u7528\u4e8e\u5b9a\u4e49\u4e3b\u952e\u7684\u5b57\u6bb5\u6216\u5c5e\u6027\u548c \u5b9e\u4f53\u7c7b\u4e2d\u5bf9\u5e94\u7684\u5b57\u6bb5\u6216\u5c5e\u6027\u5728\u7c7b\u578b\u4e0a\u5fc5\u987b\u4e00\u81f4.\u4e0b\u9762\u6211\u4eec\u770b\u4e00\u4e2a\u4f8b\u5b50:<\/p>\n<pre>@Entity\u00a0@IdClass(FootballerPk.class)\u00a0public\u00a0class\u00a0Footballer\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\/\/part\u00a0of\u00a0the\u00a0id\u00a0key\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0public\u00a0String\u00a0getFirstname()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0firstname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setFirstname(String\u00a0firstname)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.firstname\u00a0=\u00a0firstname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\/\/part\u00a0of\u00a0the\u00a0id\u00a0key\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0public\u00a0String\u00a0getLastname()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0lastname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setLastname(String\u00a0lastname)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.lastname\u00a0=\u00a0lastname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getClub()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0club;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setClub(String\u00a0club)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.club\u00a0=\u00a0club;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\/\/appropriate\u00a0equals()\u00a0and\u00a0hashCode()\u00a0implementation\u00a0}\u00a0@Embeddable\u00a0public\u00a0class\u00a0FootballerPk\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\/\/same\u00a0name\u00a0and\u00a0type\u00a0as\u00a0in\u00a0Footballer\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getFirstname()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0firstname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setFirstname(String\u00a0firstname)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.firstname\u00a0=\u00a0firstname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\/\/same\u00a0name\u00a0and\u00a0type\u00a0as\u00a0in\u00a0Footballer\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getLastname()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0lastname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setLastname(String\u00a0lastname)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.lastname\u00a0=\u00a0lastname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\/\/appropriate\u00a0equals()\u00a0and\u00a0hashCode()\u00a0implementation\u00a0}<\/pre>\n<p>\u5982\u4e0a,\u00a0<tt>@IdClass<\/tt>\u6307\u5411\u5bf9\u5e94\u7684\u4e3b\u952e\u7c7b.<\/p>\n<p>Hibernate\u652f\u6301\u5728\u7ec4\u5408\u6807\u8bc6\u7b26\u4e2d\u5b9a\u4e49\u5173\u8054(\u5c31\u50cf\u4f7f\u7528\u666e\u901a\u7684\u6ce8\u89e3\u4e00\u6837),\u800cEJB3\u89c4\u8303\u5e76\u4e0d\u652f\u6301\u6b64\u7c7b\u7528\u6cd5.<\/p>\n<pre>@Entity\u00a0@AssociationOverride(\u00a0name=\"id.channel\",\u00a0joinColumns\u00a0=\u00a0@JoinColumn(name=\"chan_id\")\u00a0)\u00a0public\u00a0class\u00a0TvMagazin\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@EmbeddedId\u00a0public\u00a0TvMagazinPk\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0@Temporal(TemporalType.TIME)\u00a0Date\u00a0time;\u00a0}\u00a0@Embeddable\u00a0public\u00a0class\u00a0TvMagazinPk\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Channel\u00a0channel;\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Presenter\u00a0presenter;\u00a0}<\/pre>\n<h3><a name=\"d0e936\"><\/a>2.2.4.\u00a0\u6620\u5c04\u7ee7\u627f\u5173\u7cfb<\/h3>\n<p>EJB3\u652f\u6301\u4e09\u79cd\u7c7b\u578b\u7684\u7ee7\u627f\u6620\u5c04:<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u6bcf\u4e2a\u7c7b\u4e00\u5f20\u8868(Table per class)\u7b56\u7565: \u5728Hibernate\u4e2d\u5bf9\u5e94&lt;union-class&gt;\u5143\u7d20:<\/li>\n<li>\u6bcf\u4e2a\u7c7b\u5c42\u6b21\u7ed3\u6784\u4e00\u5f20\u8868(Single table per class hierarchy)\u7b56\u7565:\u5728Hibernate\u4e2d\u5bf9\u5e94&lt;subclass&gt;\u5143\u7d20<\/li>\n<li>\u8fde\u63a5\u7684\u5b50\u7c7b(Joined subclasses)\u7b56\u7565:\u5728Hibernate\u4e2d\u5bf9\u5e94 &lt;joined-subclass&gt;\u5143\u7d20<\/li>\n<\/ul>\n<p>\u4f60\u53ef\u4ee5\u7528\u00a0<tt>@Inheritance<\/tt>\u6ce8\u89e3\u6765\u5b9a\u4e49\u6240\u9009\u62e9\u7684\u7b56\u7565. \u8fd9\u4e2a\u6ce8\u89e3\u9700\u8981\u5728\u6bcf\u4e2a\u7c7b\u5c42\u6b21\u7ed3\u6784(class hierarchy) \u6700\u9876\u7aef\u7684\u5b9e\u4f53\u7c7b\u4e0a\u4f7f\u7528.<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u76ee\u524d\u8fd8\u4e0d\u652f\u6301\u5728\u63a5\u53e3\u4e0a\u8fdb\u884c\u6ce8\u89e3.<\/p>\n<h4><a name=\"d0e956\"><\/a>2.2.4.1.\u00a0\u6bcf\u4e2a\u7c7b\u4e00\u5f20\u8868<\/h4>\n<p>\u8fd9\u79cd\u7b56\u7565\u6709\u5f88\u591a\u7f3a\u70b9(\u4f8b\u5982:\u591a\u6001\u67e5\u8be2\u548c\u5173\u8054),EJB3\u89c4\u8303, Hibernate\u53c2\u8003\u624b\u518c, Hibernate in Action,\u4ee5\u53ca\u5176\u4ed6\u8bb8\u591a\u5730\u65b9\u90fd\u5bf9\u6b64\u8fdb\u884c\u4e86\u63cf\u8ff0\u548c\u89e3\u91ca. Hibernate\u4f7f\u7528<tt>SQL UNION<\/tt>\u67e5\u8be2\u6765\u5b9e\u73b0\u8fd9\u79cd\u7b56\u7565. \u901a\u5e38\u4f7f\u7528\u573a\u5408\u662f\u5728\u4e00\u4e2a\u7ee7\u627f\u5c42\u6b21\u7ed3\u6784\u7684\u9876\u7aef:<\/p>\n<pre>@Entity\u00a0@Inheritance(strategy\u00a0=\u00a0InheritanceType.TABLE_PER_CLASS)\u00a0public\u00a0class\u00a0Flight\u00a0implements\u00a0Serializable\u00a0{<\/pre>\n<p>\u8fd9\u79cd\u7b56\u7565\u652f\u6301\u53cc\u5411\u7684\u4e00\u5bf9\u591a\u5173\u8054. \u8fd9\u91cc\u4e0d\u652f\u6301<tt>IDENTITY<\/tt>\u751f\u6210\u5668\u7b56\u7565,\u56e0\u4e3aid\u5fc5\u987b\u5728\u591a\u4e2a\u8868\u95f4\u5171\u4eab. \u5f53\u7136,\u4e00\u65e6\u4f7f\u7528\u8fd9\u79cd\u7b56\u7565\u5c31\u610f\u5473\u7740\u4f60\u4e0d\u80fd\u4f7f\u7528\u00a0<tt>AUTO\u00a0<\/tt>\u751f\u6210\u5668\u548c<tt>IDENTITY<\/tt>\u751f\u6210\u5668.<\/p>\n<h4><a name=\"d0e977\"><\/a>2.2.4.2.\u00a0\u6bcf\u4e2a\u7c7b\u5c42\u6b21\u7ed3\u6784\u4e00\u5f20\u8868<\/h4>\n<p>\u6574\u4e2a\u7ee7\u627f\u5c42\u6b21\u7ed3\u6784\u4e2d\u7684\u7236\u7c7b\u548c\u5b50\u7c7b\u7684\u6240\u6709\u5c5e\u6027\u90fd\u6620\u5c04\u5230\u540c\u4e00\u4e2a\u8868\u4e2d, \u4ed6\u4eec\u7684\u5b9e\u4f8b\u901a\u8fc7\u4e00\u4e2a\u8fa8\u522b\u7b26(discriminator)\u5217\u6765\u533a\u5206.:<\/p>\n<pre>@Entity\u00a0@Inheritance(strategy=InheritanceType.SINGLE_TABLE)\u00a0@DiscriminatorColumn(\u00a0\u00a0\u00a0\u00a0\u00a0name=\"planetype\",\u00a0\u00a0\u00a0\u00a0\u00a0discriminatorType=DiscriminatorType.STRING\u00a0)\u00a0@DiscriminatorValue(\"Plane\")\u00a0public\u00a0class\u00a0Plane\u00a0{\u00a0...\u00a0}\u00a0@Entity\u00a0@DiscriminatorValue(\"A320\")\u00a0public\u00a0class\u00a0A320\u00a0extends\u00a0Plane\u00a0{\u00a0...\u00a0}<\/pre>\n<p>\u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>Plane<\/tt>\u662f\u7236\u7c7b,\u5728\u8fd9\u4e2a\u7c7b\u91cc\u9762\u5c06\u7ee7\u627f\u7b56\u7565\u5b9a\u4e49\u4e3a\u00a0<tt>InheritanceType.SINGLE_TABLE<\/tt>,\u5e76\u901a\u8fc7\u00a0<tt>@DiscriminatorColumn<\/tt>\u6ce8\u89e3\u5b9a\u4e49\u4e86\u8fa8\u522b\u7b26\u5217(\u8fd8\u53ef\u4ee5\u5b9a\u4e49\u8fa8\u522b\u7b26\u7684\u7c7b\u578b). \u6700\u540e,\u5bf9\u4e8e\u7ee7\u627f\u5c42\u6b21\u7ed3\u6784\u4e2d\u7684\u6bcf\u4e2a\u7c7b,<tt>@DiscriminatorValue<\/tt>\u6ce8\u89e3\u6307\u5b9a\u4e86\u7528\u6765\u8fa8\u522b\u8be5\u7c7b\u7684\u503c. \u8fa8\u522b\u7b26\u5217\u7684\u540d\u5b57\u9ed8\u8ba4\u4e3a\u00a0<tt>DTYPE<\/tt>,\u5176\u9ed8\u8ba4\u503c\u4e3a\u5b9e\u4f53\u540d(\u5728<tt>@Entity.name<\/tt>\u4e2d\u5b9a\u4e49)\uff0c\u5176\u7c7b\u578b \u4e3aDiscriminatorType.STRING.\u00a0<tt>A320<\/tt>\u662f\u5b50\u7c7b,\u5982\u679c\u4e0d\u60f3\u4f7f\u7528\u9ed8\u8ba4\u7684\u8fa8\u522b\u7b26,\u53ea\u9700\u8981\u6307\u5b9a\u76f8\u5e94\u7684\u503c\u5373\u53ef. \u5176\u4ed6\u7684\u5982\u7ee7\u627f\u7b56\u7565,\u8fa8\u522b\u6807\u5fd7\u5b57\u6bb5\u7684\u7c7b\u578b\u90fd\u662f\u81ea\u52a8\u8bbe\u5b9a\u7684.<\/p>\n<p><tt>@Inheritance<\/tt>\u00a0\u548c\u00a0<tt>@DiscriminatorColumn<\/tt>\u00a0\u6ce8\u89e3\u53ea\u80fd\u7528\u4e8e\u5b9e\u4f53\u5c42\u6b21\u7ed3\u6784\u7684\u9876\u7aef.<\/p>\n<h4><a name=\"d0e1014\"><\/a>2.2.4.3.\u00a0\u8fde\u63a5\u7684\u5b50\u7c7b<\/h4>\n<p>\u5f53\u6bcf\u4e2a\u5b50\u7c7b\u6620\u5c04\u5230\u4e00\u4e2a\u8868\u65f6,\u00a0<tt>@PrimaryKeyJoinColumn<\/tt>\u00a0\u548c<tt>@PrimaryKeyJoinColumns<\/tt>\u00a0\u6ce8\u89e3\u5b9a\u4e49\u4e86\u6bcf\u4e2a\u5b50\u7c7b\u8868\u5173\u8054\u5230\u7236\u7c7b\u8868\u7684\u4e3b\u952e:<\/p>\n<pre>@Entity\u00a0@Inheritance(strategy=InheritanceType.JOINED)\u00a0public\u00a0class\u00a0Boat\u00a0implements\u00a0Serializable\u00a0{\u00a0...\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Ferry\u00a0extends\u00a0Boat\u00a0{\u00a0...\u00a0}\u00a0@Entity\u00a0@PrimaryKeyJoinColumn(name=\"BOAT_ID\")\u00a0public\u00a0class\u00a0AmericaCupClass\u00a0\u00a0extends\u00a0Boat\u00a0{\u00a0...\u00a0}<\/pre>\n<p>\u4ee5\u4e0a\u6240\u6709\u5b9e\u4f53\u90fd\u4f7f\u7528\u4e86<tt>JOINED<\/tt>\u7b56\u7565,\u00a0<tt>Ferry<\/tt>\u8868\u548c<tt>Boat<\/tt>\u8868\u4f7f\u7528\u540c\u540d\u7684\u4e3b\u952e. \u800c<tt>AmericaCupClass<\/tt>\u8868\u548c<tt>Boat<\/tt>\u8868\u4f7f\u7528\u4e86\u6761\u4ef6\u00a0<tt>Boat.id = AmericaCupClass.BOAT_ID<\/tt>\u8fdb\u884c\u5173\u8054.<\/p>\n<h4><a name=\"d0e1047\"><\/a>2.2.4.4.\u00a0\u4ece\u7236\u7c7b\u7ee7\u627f\u7684\u5c5e\u6027<\/h4>\n<p>\u6709\u65f6\u5019\u901a\u8fc7\u4e00\u4e2a(\u6280\u672f\u4e0a\u6216\u4e1a\u52a1\u4e0a)\u7236\u7c7b\u5171\u4eab\u4e00\u4e9b\u516c\u5171\u5c5e\u6027\u662f\u5f88\u6709\u7528\u7684, \u540c\u65f6\u8fd8\u4e0d\u7528\u5c06\u8be5\u7236\u7c7b\u4f5c\u4e3a\u6620\u5c04\u7684\u5b9e\u4f53(\u4e5f\u5c31\u662f\u8be5\u5b9e\u4f53\u6ca1\u6709\u5bf9\u5e94\u7684\u8868). \u8fd9\u4e2a\u65f6\u5019\u4f60\u9700\u8981\u4f7f\u7528<tt>@MappedSuperclass<\/tt>\u6ce8\u89e3\u6765\u8fdb\u884c\u6620\u5c04.<\/p>\n<pre>@MappedSuperclass\u00a0public\u00a0class\u00a0BaseEntity\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Basic\u00a0\u00a0\u00a0\u00a0\u00a0@Temporal(TemporalType.TIMESTAMP)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Date\u00a0getLastUpdate()\u00a0{\u00a0...\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getLastUpdater()\u00a0{\u00a0...\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Entity\u00a0class\u00a0Order\u00a0extends\u00a0BaseEntity\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0public\u00a0Integer\u00a0getId()\u00a0{\u00a0...\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u5728\u6570\u636e\u5e93\u4e2d,\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u7684\u7ee7\u627f\u7684\u5c42\u6b21\u7ed3\u6784\u6700\u7ec8\u4ee5<tt>Order<\/tt>\u8868\u7684\u5f62\u5f0f\u51fa\u73b0, \u8be5\u8868\u62e5\u6709<tt>id<\/tt>,\u00a0<tt>lastUpdate<\/tt>\u00a0\u548c\u00a0<tt>lastUpdater<\/tt>\u4e09\u4e2a\u5217.\u7236\u7c7b\u4e2d\u7684\u5c5e\u6027\u6620\u5c04\u5c06\u590d\u5236\u5230\u5176\u5b50\u7c7b\u5b9e\u4f53. \u6ce8\u610f\u8fd9\u79cd\u60c5\u51b5\u4e0b\u7684\u7236\u7c7b\u4e0d\u518d\u5904\u5728\u7ee7\u627f\u5c42\u6b21\u7ed3\u6784\u7684\u9876\u7aef.<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u6ce8\u610f,\u6ca1\u6709\u6ce8\u89e3\u4e3a<tt>@MappedSuperclass<\/tt>\u7684\u7236\u7c7b\u4e2d\u7684\u5c5e\u6027\u5c06\u88ab\u5ffd\u7565.<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u9664\u975e\u663e\u5f0f\u4f7f\u7528Hibernate annotation\u4e2d\u7684<tt>@AccessType<\/tt>\u6ce8\u89e3, \u5426\u5219\u5c06\u4ece\u7ee7\u627f\u5c42\u6b21\u7ed3\u6784\u7684\u6839\u5b9e\u4f53\u4e2d\u7ee7\u627f\u8bbf\u95ee\u7c7b\u578b(\u5305\u62ec\u5b57\u6bb5\u6216\u65b9\u6cd5)<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u8fd9\u5bf9\u4e8e<tt>@Embeddable<\/tt>\u5bf9\u8c61\u7684\u7236\u7c7b\u4e2d\u7684\u5c5e\u6027\u6301\u4e45\u5316\u540c\u6837\u6709\u6548. \u53ea\u9700\u8981\u4f7f\u7528<tt>@MappedSuperclass<\/tt>\u6ce8\u89e3\u5373\u53ef (\u867d\u7136\u8fd9\u79cd\u65b9\u5f0f\u4e0d\u4f1a\u7eb3\u5165EJB3\u6807\u51c6)<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u53ef\u4ee5\u5c06\u5904\u5728\u5728\u6620\u5c04\u7ee7\u627f\u5c42\u6b21\u7ed3\u6784\u7684\u4e2d\u95f4\u4f4d\u7f6e\u7684\u7c7b\u6ce8\u89e3\u4e3a<tt>@MappedSuperclass<\/tt>.<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u5728\u7ee7\u627f\u5c42\u6b21\u7ed3\u6784\u4e2d\u4efb\u4f55\u6ca1\u6709\u88ab\u6ce8\u89e3\u4e3a<tt>@MappedSuperclass<\/tt>\u00a0\u6216<tt>@Entity<\/tt>\u7684\u7c7b\u90fd\u5c06\u88ab\u5ffd\u7565.<\/p>\n<p>\u4f60\u53ef\u4ee5\u901a\u8fc7\u00a0<tt>@AttributeOverride<\/tt>\u6ce8\u89e3\u8986\u76d6\u5b9e\u4f53\u7236\u7c7b\u4e2d\u7684\u5b9a\u4e49\u7684\u5217. \u8fd9\u4e2a\u6ce8\u89e3\u53ea\u80fd\u5728\u7ee7\u627f\u5c42\u6b21\u7ed3\u6784\u7684\u9876\u7aef\u4f7f\u7528.<\/p>\n<pre>@MappedSuperclass\u00a0public\u00a0class\u00a0FlyingObject\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0int\u00a0getAltitude()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0altitude;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@Transient\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0int\u00a0getMetricAltitude()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0metricAltitude;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0PropulsionType\u00a0getPropulsion()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0metricAltitude;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Entity\u00a0@AttributeOverride(\u00a0name=\"altitude\",\u00a0column\u00a0=\u00a0@Column(name=\"fld_altitude\")\u00a0)\u00a0@AssociationOverride(\u00a0name=\"propulsion\",\u00a0joinColumns\u00a0=\u00a0@JoinColumn(name=\"fld_propulsion_fk\")\u00a0)\u00a0public\u00a0class\u00a0Plane\u00a0extends\u00a0FlyingObject\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>altitude<\/tt>\u5c5e\u6027\u7684\u503c\u6700\u7ec8\u5c06\u6301\u4e45\u5316\u5230<tt>Plane<\/tt>\u00a0\u8868\u7684<tt>fld_altitude<\/tt>\u5217.\u800c\u540d\u4e3apropulsion\u7684\u5173\u8054\u5219\u4fdd\u5b58\u5728<tt>fld_propulsion_fk<\/tt>\u5916\u95f4\u5217.<\/p>\n<p>\u4f60\u53ef\u4ee5\u4e3a<tt>@Entity<\/tt>\u548c<tt>@MappedSuperclass<\/tt>\u6ce8\u89e3\u7684\u7c7b \u4ee5\u53ca\u90a3\u4e9b\u5bf9\u8c61\u4e3a<tt>@Embeddable<\/tt>\u7684\u5c5e\u6027\u5b9a\u4e49\u00a0<tt>@AttributeOverride<\/tt>\u548c<tt>@AssociationOverride<\/tt>.<\/p>\n<h3><a name=\"entity-mapping-association\"><\/a>2.2.5.\u00a0\u6620\u5c04\u5b9e\u4f53Bean\u7684\u5173\u8054\u5173\u7cfb<\/h3>\n<h4><a name=\"d0e1148\"><\/a>2.2.5.1.\u00a0\u4e00\u5bf9\u4e00(One-to-one)<\/h4>\n<p>\u4f7f\u7528<tt>@OneToOne<\/tt>\u6ce8\u89e3\u53ef\u4ee5\u5efa\u7acb\u5b9e\u4f53bean\u4e4b\u95f4\u7684\u4e00\u5bf9\u4e00\u7684\u5173\u8054. \u4e00\u5bf9\u4e00\u5173\u8054\u6709\u4e09\u79cd\u60c5\u51b5\uff1a \u4e00\u662f\u5173\u8054\u7684\u5b9e\u4f53\u90fd\u5171\u4eab\u540c\u6837\u7684\u4e3b\u952e, \u4e8c\u662f\u5176\u4e2d\u4e00\u4e2a\u5b9e\u4f53\u901a\u8fc7\u5916\u952e\u5173\u8054\u5230\u53e6\u4e00\u4e2a\u5b9e\u4f53\u7684\u4e3b\u952e (\u6ce8\u610f\u8981\u6a21\u62df\u4e00\u5bf9\u4e00\u5173\u8054\u5fc5\u987b\u5728\u5916\u952e\u5217\u4e0a\u6dfb\u52a0\u552f\u4e00\u7ea6\u675f). \u4e09\u662f\u901a\u8fc7\u5173\u8054\u8868\u6765\u4fdd\u5b58\u4e24\u4e2a\u5b9e\u4f53\u4e4b\u95f4\u7684\u8fde\u63a5\u5173\u7cfb (\u6ce8\u610f\u8981\u6a21\u62df\u4e00\u5bf9\u4e00\u5173\u8054\u5fc5\u987b\u5728\u6bcf\u4e00\u4e2a\u5916\u952e\u4e0a\u6dfb\u52a0\u552f\u4e00\u7ea6\u675f).<\/p>\n<p>\u9996\u5148,\u6211\u4eec\u901a\u8fc7\u5171\u4eab\u4e3b\u952e\u6765\u8fdb\u884c\u4e00\u5bf9\u4e00\u5173\u8054\u6620\u5c04:<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Body\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Long\u00a0getId()\u00a0{\u00a0return\u00a0id;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@OneToOne(cascade\u00a0=\u00a0CascadeType.ALL)\u00a0\u00a0\u00a0\u00a0\u00a0@PrimaryKeyJoinColumn\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Heart\u00a0getHeart()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0heart;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<pre>@Entity\u00a0public\u00a0class\u00a0Heart\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Long\u00a0getId()\u00a0{\u00a0...}\u00a0}<\/pre>\n<p>\u4e0a\u9762\u7684\u4f8b\u5b50\u901a\u8fc7\u4f7f\u7528\u6ce8\u89e3<tt>@PrimaryKeyJoinColumn<\/tt>\u5b9a\u4e49\u4e86\u4e00\u5bf9\u4e00\u5173\u8054.<\/p>\n<p>\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4f7f\u7528\u5916\u952e\u5217\u8fdb\u884c\u5b9e\u4f53\u7684\u5173\u8054.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Customer\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToOne(cascade\u00a0=\u00a0CascadeType.ALL)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"passport_fk\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Passport\u00a0getPassport()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Passport\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToOne(mappedBy\u00a0=\u00a0\"passport\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Customer\u00a0getOwner()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>Customer<\/tt>\u00a0\u901a\u8fc7<tt>Customer<\/tt>\u00a0\u8868\u4e2d\u540d\u4e3a\u7684<tt>passport_fk<\/tt>\u00a0\u5916\u952e\u5217\u548c\u00a0<tt>Passport<\/tt>\u5173\u8054.\u00a0<tt>@JoinColumn<\/tt>\u6ce8\u89e3\u5b9a\u4e49\u4e86\u8054\u63a5\u5217(join column). \u8be5\u6ce8\u89e3\u548c<tt>@Column<\/tt>\u6ce8\u89e3\u6709\u70b9\u7c7b\u4f3c, \u4f46\u662f\u591a\u4e86\u4e00\u4e2a\u540d\u4e3a<tt>referencedColumnName<\/tt>\u7684\u53c2\u6570. \u8be5\u53c2\u6570\u5b9a\u4e49\u4e86\u6240\u5173\u8054\u76ee\u6807\u5b9e\u4f53\u4e2d\u7684\u8054\u63a5\u5217. \u6ce8\u610f,\u5f53<tt><tt>referencedColumnName<\/tt><\/tt>\u5173\u8054\u5230\u975e\u4e3b\u952e\u5217\u7684\u65f6\u5019, \u5173\u8054\u7684\u76ee\u6807\u7c7b\u5fc5\u987b\u5b9e\u73b0<tt>Serializable<\/tt>, \u8fd8\u8981\u6ce8\u610f\u7684\u662f\u6240\u6620\u5c04\u7684\u5c5e\u6027\u5bf9\u5e94\u5355\u4e2a\u5217(\u5426\u5219\u6620\u5c04\u65e0\u6548).<\/p>\n<p>\u4e00\u5bf9\u4e00\u5173\u8054\u53ef\u80fd\u662f\u53cc\u5411\u7684.\u5728\u53cc\u5411\u5173\u8054\u4e2d, \u6709\u4e14\u4ec5\u6709\u4e00\u7aef\u662f\u4f5c\u4e3a\u4e3b\u4f53(owner)\u7aef\u5b58\u5728\u7684\uff1a\u4e3b\u4f53\u7aef\u8d1f\u8d23\u7ef4\u62a4\u8054\u63a5\u5217(\u5373\u66f4\u65b0). \u5bf9\u4e8e\u4e0d\u9700\u8981\u7ef4\u62a4\u8fd9\u79cd\u5173\u7cfb\u7684\u4ece\u8868\u5219\u901a\u8fc7mappedBy\u5c5e\u6027\u8fdb\u884c\u58f0\u660e.\u00a0<tt>mappedBy<\/tt>\u7684\u503c\u6307\u5411\u4e3b\u4f53\u7684\u5173\u8054\u5c5e\u6027. \u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>mappedBy<\/tt>\u7684\u503c\u4e3a\u00a0<tt>passport<\/tt>. \u6700\u540e,\u4e0d\u5fc5\u4e5f\u4e0d\u80fd\u518d\u5728\u88ab\u5173\u8054\u7aef(owned side)\u5b9a\u4e49\u8054\u63a5\u5217\u4e86,\u56e0\u4e3a\u5df2\u7ecf\u5728\u4e3b\u4f53\u7aef\u8fdb\u884c\u4e86\u58f0\u660e.<\/p>\n<p>\u5982\u679c\u5728\u4e3b\u4f53\u6ca1\u6709\u58f0\u660e<tt>@JoinColumn<\/tt>,\u7cfb\u7edf\u81ea\u52a8\u8fdb\u884c\u5904\u7406\uff1a \u5728\u4e3b\u8868(owner table)\u4e2d\u5c06\u521b\u5efa\u8054\u63a5\u5217, \u5217\u540d\u4e3a\uff1a\u4e3b\u4f53\u7684\u5173\u8054\u5c5e\u6027\u540d\uff0b\u4e0b\u5212\u7ebf\uff0b\u88ab\u5173\u8054\u7aef\u7684\u4e3b\u952e\u5217\u540d. \u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u662f<tt>passport_id<\/tt>, \u56e0\u4e3a<tt>Customer<\/tt>\u4e2d\u5173\u8054\u5c5e\u6027\u540d\u4e3a<tt>passport<\/tt>,\u00a0<tt>Passport<\/tt>\u7684\u4e3b\u952e\u662f<tt>id<\/tt>.<\/p>\n<p>The third possibility (using an association table) is very exotic.<\/p>\n<p>\u7b2c\u4e09\u79cd\u65b9\u5f0f\u4e5f\u8bb8\u662f\u6700\u53e6\u7c7b\u7684(\u901a\u8fc7\u5173\u8054\u8868).<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Customer\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToOne(cascade\u00a0=\u00a0CascadeType.ALL)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinTable(name\u00a0=\u00a0\"CustomerPassports\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0joinColumns\u00a0=\u00a0@JoinColumn(name=\"customer_fk\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0inverseJoinColumns\u00a0=\u00a0@JoinColumn(name=\"passport_fk\")\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Passport\u00a0getPassport()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Passport\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToOne(mappedBy\u00a0=\u00a0\"passport\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Customer\u00a0getOwner()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p><tt>Customer<\/tt>\u901a\u8fc7\u540d\u4e3a\u00a0<tt>CustomerPassports<\/tt>\u7684\u5173\u8054\u8868\u548c\u00a0<tt>Passport<\/tt>\u5173\u8054; \u8be5\u5173\u8054\u8868\u62e5\u6709\u540d\u4e3a<tt>passport_fk<\/tt>\u7684\u5916\u952e\u5217,\u8be5 \u5916\u952e\u6307\u5411<tt>Passport<\/tt>\u8868,\u8be5\u4fe1\u606f\u5b9a\u4e49\u4e3a<tt>inverseJoinColumn<\/tt>\u7684\u5c5e\u6027\u503c, \u800c<tt>customer_fk<\/tt>\u5916\u952e\u5217\u6307\u5411<tt>Customer<\/tt>\u8868, \u8be5\u4fe1\u606f\u5b9a\u4e49\u4e3a\u00a0<tt>joinColumns<\/tt>\u7684\u5c5e\u6027\u503c.<\/p>\n<p>\u8fd9\u79cd\u5173\u8054\u53ef\u80fd\u662f\u53cc\u5411\u7684.\u5728\u53cc\u5411\u5173\u8054\u4e2d, \u6709\u4e14\u4ec5\u6709\u4e00\u7aef\u662f\u4f5c\u4e3a\u4e3b\u4f53\u7aef\u5b58\u5728\u7684\uff1a\u4e3b\u4f53\u7aef\u8d1f\u8d23\u7ef4\u62a4\u8054\u63a5\u5217(\u5373\u66f4\u65b0). \u5bf9\u4e8e\u4e0d\u9700\u8981\u7ef4\u62a4\u8fd9\u79cd\u5173\u7cfb\u7684\u4ece\u8868\u5219\u901a\u8fc7mappedBy\u5c5e\u6027\u8fdb\u884c\u58f0\u660e.\u00a0<tt>mappedBy<\/tt>\u7684\u503c\u6307\u5411\u4e3b\u4f53\u7684\u5173\u8054\u5c5e\u6027. \u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>mappedBy<\/tt>\u7684\u503c\u4e3a\u00a0<tt>passport<\/tt>. \u6700\u540e,\u4e0d\u5fc5\u4e5f\u4e0d\u80fd\u518d\u5728\u88ab\u5173\u8054\u7aef(owned side)\u5b9a\u4e49\u8054\u63a5\u5217\u4e86,\u56e0\u4e3a\u5df2\u7ecf\u5728\u4e3b\u4f53\u7aef\u8fdb\u884c\u4e86\u58f0\u660e.<\/p>\n<p>\u4f60\u5fc5\u987b\u660e\u786e\u5b9a\u4e49\u5173\u8054\u8868\u540d\u548c\u5173\u8054\u5217\u540d.<\/p>\n<h4><a name=\"d0e1291\"><\/a>2.2.5.2.\u00a0\u591a\u5bf9\u4e00(Many-to-one)<\/h4>\n<p>\u5728\u5b9e\u4f53\u5c5e\u6027\u4e00\u7ea7\u4f7f\u7528<tt>@ManyToOne<\/tt>\u6ce8\u89e3\u6765\u5b9a\u4e49\u591a\u5bf9\u4e00\u5173\u8054:<\/p>\n<pre>@Entity()\u00a0public\u00a0class\u00a0Flight\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne(\u00a0cascade\u00a0=\u00a0{CascadeType.PERSIST,\u00a0CascadeType.MERGE}\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"COMP_ID\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Company\u00a0getCompany()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0company;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u5176\u4e2d<tt>@JoinColumn<\/tt>\u662f\u53ef\u9009\u7684,\u5173\u8054\u5b57\u6bb5\u9ed8\u8ba4\u503c\u548c\u4e00\u5bf9\u4e00 (one to one)\u5173\u8054\u7684\u60c5\u51b5\u76f8\u4f3c, \u5217\u540d\u4e3a\uff1a\u4e3b\u4f53\u7684\u5173\u8054\u5c5e\u6027\u540d\uff0b\u4e0b\u5212\u7ebf\uff0b\u88ab\u5173\u8054\u7aef\u7684\u4e3b\u952e\u5217\u540d. \u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u662f<tt>company_id<\/tt>, \u56e0\u4e3a\u5173\u8054\u7684\u5c5e\u6027\u662f<tt>company<\/tt>,\u00a0<tt>Company<\/tt>\u7684\u4e3b\u952e\u662f<tt>id<\/tt>.<\/p>\n<p><tt>@ManyToOne<\/tt>\u6ce8\u89e3\u6709\u4e00\u4e2a\u540d\u4e3a<tt>targetEntity<\/tt>\u7684\u53c2\u6570, \u8be5\u53c2\u6570\u5b9a\u4e49\u4e86\u76ee\u6807\u5b9e\u4f53\u540d.\u901a\u5e38\u4e0d\u9700\u8981\u5b9a\u4e49\u8be5\u53c2\u6570, \u56e0\u4e3a\u5728\u5927\u90e8\u5206\u60c5\u51b5\u4e0b\u9ed8\u8ba4\u503c(\u8868\u793a\u5173\u8054\u5173\u7cfb\u7684\u5c5e\u6027\u7c7b\u578b)\u5c31\u53ef\u4ee5\u5f88\u597d\u7684\u6ee1\u8db3\u8981\u6c42\u4e86. \u4e0d\u8fc7\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\u4e0b\u8fd9\u4e2a\u53c2\u6570\u5c31\u663e\u5f97\u6709\u610f\u4e49\u4e86\uff1a\u4f7f\u7528\u63a5\u53e3\u4f5c\u4e3a\u8fd4\u56de\u503c\u800c\u4e0d\u662f\u5e38\u89c1\u7684\u5b9e\u4f53.<\/p>\n<pre>@Entity()\u00a0public\u00a0class\u00a0Flight\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne(\u00a0cascade\u00a0=\u00a0{CascadeType.PERSIST,\u00a0CascadeType.MERGE},\u00a0targetEntity=CompanyImpl.class\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"COMP_ID\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Company\u00a0getCompany()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0company;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0public\u00a0interface\u00a0Company\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...<\/pre>\n<p>\u5bf9\u4e8e\u591a\u5bf9\u4e00\u4e5f\u53ef\u4ee5\u901a\u8fc7\u5173\u8054\u8868\u7684\u65b9\u5f0f\u6765\u6620\u5c04\u3002 \u901a\u8fc7<tt>@JoinTable<\/tt>\u6ce8\u89e3\u53ef\u5b9a\u4e49\u5173\u8054\u8868\uff0c \u8be5\u5173\u8054\u8868\u5305\u542b\u4e86\u6307\u56de\u5b9e\u4f53\u8868\u7684\u5916\u952e(\u901a\u8fc7<tt>@JoinTable.joinColumns<\/tt>) \u4ee5\u53ca\u6307\u5411\u76ee\u6807\u5b9e\u4f53\u8868\u7684\u5916\u952e(\u901a\u8fc7<tt>@JoinTable.inverseJoinColumns<\/tt>).<\/p>\n<pre>@Entity()\u00a0public\u00a0class\u00a0Flight\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne(\u00a0cascade\u00a0=\u00a0{CascadeType.PERSIST,\u00a0CascadeType.MERGE}\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinTable(name=\"Flight_Company\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0joinColumns\u00a0=\u00a0@JoinColumn(name=\"FLIGHT_ID\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0inverseJoinColumns\u00a0=\u00a0@JoinColumn(name=\"COMP_ID\")\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Company\u00a0getCompany()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0company;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<h4><a name=\"entity-mapping-association-collections\"><\/a>2.2.5.3.\u00a0\u96c6\u5408\u7c7b\u578b<\/h4>\n<h5><a name=\"d0e1352\"><\/a>2.2.5.3.1.\u00a0\u6982\u51b5<\/h5>\n<p>\u4f60\u53ef\u4ee5\u5bf9\u00a0<tt>Collection\u00a0<\/tt>,<tt>List<\/tt>\u00a0(\u6307\u6709\u5e8f\u5217\u8868, \u800c\u4e0d\u662f\u7d22\u5f15\u5217\u8868),\u00a0<tt>Map<\/tt>\u548c<tt>Set<\/tt>\u8fd9\u51e0\u79cd\u7c7b\u578b\u8fdb\u884c\u6620\u5c04. EJB3\u89c4\u8303\u5b9a\u4e49\u4e86\u600e\u4e48\u6837\u4f7f\u7528<tt>@javax.persistence.OrderBy<\/tt>\u00a0\u6ce8\u89e3\u6765\u5bf9\u6709\u5e8f\u5217\u8868\u8fdb\u884c\u6620\u5c04\uff1a \u8be5\u6ce8\u89e3\u63a5\u53d7\u7684\u53c2\u6570\u683c\u5f0f\uff1a\u7528\u9017\u53f7\u9694\u5f00\u7684(\u76ee\u6807\u5b9e\u4f53)\u5c5e\u6027\u540d\u53ca\u6392\u5e8f\u6307\u4ee4, \u5982<tt>firstname asc, age desc<\/tt>,\u5982\u679c\u8be5\u53c2\u6570\u4e3a\u7a7a,\u5219\u9ed8\u8ba4\u4ee5id\u5bf9\u8be5\u96c6\u5408\u8fdb\u884c\u6392\u5e8f. \u5982\u679c\u67d0\u4e2a\u96c6\u5408\u5728\u6570\u636e\u5e93\u4e2d\u5bf9\u5e94\u4e00\u4e2a\u5173\u8054\u8868(association table)\u7684\u8bdd,\u4f60\u4e0d\u80fd\u5728\u8fd9\u4e2a\u96c6\u5408\u5c5e\u6027\u4e0a\u9762\u4f7f\u7528@OrderBy\u6ce8\u89e3. \u5bf9\u4e8e\u8fd9\u79cd\u60c5\u51b5\u7684\u5904\u7406\u65b9\u6cd5,\u8bf7\u53c2\u8003<a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec\">Hibernate Annotation Extensions<\/a>. EJB3 \u5141\u8bb8\u4f60\u5229\u7528\u76ee\u6807\u5b9e\u4f53\u7684\u4e00\u4e2a\u5c5e\u6027\u4f5c\u4e3aMap\u7684key, \u8fd9\u4e2a\u5c5e\u6027\u53ef\u4ee5\u7528<tt>@MapKey(name=\"myProperty\")<\/tt>\u6765\u58f0\u660e. \u5982\u679c\u4f7f\u7528<tt>@MapKey<\/tt>\u6ce8\u89e3\u7684\u65f6\u5019\u4e0d\u63d0\u4f9b\u5c5e\u6027\u540d, \u7cfb\u7edf\u9ed8\u8ba4\u4f7f\u7528\u76ee\u6807\u5b9e\u4f53\u7684\u4e3b\u952e. map\u7684key\u4f7f\u7528\u548c\u5c5e\u6027\u76f8\u540c\u7684\u5217\uff1a\u4e0d\u9700\u8981\u4e3amap key\u5b9a\u4e49\u4e13\u7528\u7684\u5217\uff0c\u56e0\u4e3amap key\u5b9e\u9645\u4e0a\u5c31\u8868\u8fbe\u4e86\u4e00\u4e2a\u76ee\u6807\u5c5e\u6027\u3002 \u6ce8\u610f\u4e00\u65e6\u52a0\u8f7d,key\u4e0d\u518d\u548c\u5c5e\u6027\u4fdd\u6301\u540c\u6b65, \u4e5f\u5c31\u662f\u8bf4,\u5982\u679c\u4f60\u6539\u53d8\u4e86\u8be5\u5c5e\u6027\u7684\u503c,\u5728\u4f60\u7684Java\u6a21\u578b\u4e2d\u7684key\u4e0d\u4f1a\u81ea\u52a8\u66f4\u65b0 (\u8bf7\u53c2\u8003<a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec\">Hibernate Annotation Extensions<\/a>). \u5f88\u591a\u4eba\u88ab<tt>&lt;map&gt;<\/tt>\u548c<tt>@MapKey<\/tt>\u5f04\u7cca\u6d82\u4e86\u3002 \u5176\u4ed6\u5b83\u4eec\u6709\u4e24\u70b9\u533a\u522b.<tt>@MapKey<\/tt>\u76ee\u524d\u8fd8\u6709\u4e00\u4e9b\u9650\u5236,\u8be6\u60c5\u8bf7\u67e5\u770b\u8bba\u575b\u6216\u8005 \u6211\u4eec\u7684JIRA\u7f3a\u9677\u7cfb\u7edf\u3002 \u6ce8\u610f\u4e00\u65e6\u52a0\u8f7d,key\u4e0d\u518d\u548c\u5c5e\u6027\u4fdd\u6301\u540c\u6b65, \u4e5f\u5c31\u662f\u8bf4,\u5982\u679c\u4f60\u6539\u53d8\u4e86\u8be5\u5c5e\u6027\u7684\u503c,\u5728\u4f60\u7684Java\u6a21\u578b\u4e2d\u7684key\u4e0d\u4f1a\u81ea\u52a8\u66f4\u65b0. (Hibernate 3\u4e2dMap\u652f\u6301\u7684\u65b9\u5f0f\u5728\u5f53\u524d\u7684\u53d1\u5e03\u7248\u4e2d\u8fd8\u672a\u5f97\u5230\u652f\u6301).<\/p>\n<p>Hibernate\u5c06\u96c6\u5408\u5206\u4ee5\u4e0b\u51e0\u7c7b.<\/p>\n<p><a name=\"d0e1397\"><\/a><\/p>\n<p><strong>\u8868\u00a02.1.\u00a0\u96c6\u5408\u8bed\u4e49<\/strong><\/p>\n<table summary=\"\u96c6\u5408\u8bed\u4e49\">\n<colgroup>\n<col \/>\n<col \/>\n<col \/><\/colgroup>\n<thead>\n<tr class=\"firstRow\">\n<th>\u8bed\u4e49<\/th>\n<th>Java\u5b9e\u73b0\u7c7b<\/th>\n<th>\u6ce8\u89e3<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Bag \u8bed\u4e49<\/td>\n<td>java.util.List, java.util.Collection<\/td>\n<td>@org.hibernate.annotations.CollectionOfElements \u6216 @OneToMany \u6216 @ManyToMany<\/td>\n<\/tr>\n<tr>\n<td>List \u8bed\u4e49<\/td>\n<td>java.util.List<\/td>\n<td>(@org.hibernate.annotations.CollectionOfElements \u6216 @OneToMany \u6216 @ManyToMany) \u4ee5\u53ca @org.hibernate.annotations.IndexColumn<\/td>\n<\/tr>\n<tr>\n<td>Set \u8bed\u4e49<\/td>\n<td>java.util.Set<\/td>\n<td>@org.hibernate.annotations.CollectionOfElements \u6216 @OneToMany \u6216 @ManyToMany<\/td>\n<\/tr>\n<tr>\n<td>Map \u8bed\u4e49<\/td>\n<td>java.util.Map<\/td>\n<td>(@org.hibernate.annotations.CollectionOfElements \u6216 @OneToMany \u6216 @ManyToMany) \u4ee5\u53ca (\u7a7a \u6216 @org.hibernate.annotations.MapKey\/MapKeyManyToMany(\u652f\u6301\u771f\u6b63\u7684map), \u6216 @javax.persistence.MapKey<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><em>\u4ece\u4e0a\u9762\u53ef\u4ee5\u660e\u786e\u5730\u770b\u5230,\u6ca1\u6709@org.hibernate.annotations.IndexColumn \u6ce8\u89e3\u7684java.util.List\u96c6\u5408\u5c06\u88ab\u770b\u4f5cbag\u7c7b.<\/em><\/p>\n<p>EJB3\u89c4\u8303\u4e0d\u652f\u6301\u539f\u59cb\u7c7b\u578b,\u6838\u5fc3\u7c7b\u578b,\u5d4c\u5165\u5f0f\u5bf9\u8c61\u7684\u96c6\u5408.\u4f46\u662fHibernate\u5bf9\u6b64\u63d0\u4f9b\u4e86\u652f\u6301 (\u8be6\u60c5\u53c2\u8003\u00a0<a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#entity-hibspec\">Hibernate Annotation Extensions<\/a>).<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0City\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToMany(mappedBy=\"city\")\u00a0\u00a0\u00a0\u00a0\u00a0@OrderBy(\"streetName\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0List&lt;Street&gt;\u00a0getStreets()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0streets;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0...\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Street\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getStreetName()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0streetName;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0City\u00a0getCity()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0city;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Software\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToMany(mappedBy=\"software\")\u00a0\u00a0\u00a0\u00a0\u00a0@MapKey(name=\"codeName\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Map&lt;String,\u00a0Version&gt;\u00a0getVersions()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0versions;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0...\u00a0}\u00a0@Entity\u00a0@Table(name=\"tbl_version\")\u00a0public\u00a0class\u00a0Version\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getCodeName()\u00a0{...}\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Software\u00a0getSoftware()\u00a0{\u00a0...\u00a0}\u00a0...\u00a0}<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>City<\/tt>\u00a0\u4e2d\u5305\u62ec\u4e86\u4ee5<tt>streetName<\/tt>\u6392\u5e8f\u7684<tt>Street<\/tt>\u7684\u96c6\u5408. \u800c<tt>Software<\/tt>\u4e2d\u5305\u62ec\u4e86\u4ee5<tt>codeName<\/tt>\u4f5c\u4e3a key\u548c\u4ee5<tt>Version<\/tt>\u4f5c\u4e3a\u503c\u7684Map.<\/p>\n<p>\u9664\u975e\u96c6\u5408\u4e3ageneric\u7c7b\u578b,\u5426\u5219\u4f60\u9700\u8981\u6307\u5b9a<tt>targetEntity<\/tt>. \u8fd9\u4e2a\u6ce8\u89e3\u5c5e\u6027\u63a5\u53d7\u7684\u53c2\u6570\u4e3a\u76ee\u6807\u5b9e\u4f53\u7684class.<\/p>\n<h5><a name=\"entity-mapping-association-collection-onetomany\"><\/a>2.2.5.3.2.\u00a0\u4e00\u5bf9\u591a(One-to-many)<\/h5>\n<p>\u5728\u5c5e\u6027\u7ea7\u4f7f\u7528\u00a0<tt>@OneToMany<\/tt>\u6ce8\u89e3\u53ef\u5b9a\u4e49\u4e00\u5bf9\u591a\u5173\u8054.\u4e00\u5bf9\u591a\u5173\u8054\u53ef\u4ee5\u662f\u53cc\u5411\u5173\u8054.<\/p>\n<h6><a name=\"d0e1494\"><\/a>2.2.5.3.2.1.\u00a0\u53cc\u5411(Bidirectional)<\/h6>\n<p>\u5728EJB3\u89c4\u8303\u4e2d\u591a\u5bf9\u4e00\u8fd9\u7aef\u51e0\u4e4e\u603b\u662f\u53cc\u5411\u5173\u8054\u4e2d\u7684\u4e3b\u4f53(owner)\u7aef, \u800c\u4e00\u5bf9\u591a\u8fd9\u7aef\u7684\u5173\u8054\u6ce8\u89e3\u4e3a<tt>@OneToMany( mappedBy=... )<\/tt><\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Troop\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToMany(mappedBy=\"troop\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Soldier&gt;\u00a0getSoldiers()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Soldier\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"troop_fk\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Troop\u00a0getTroop()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p><tt>Troop<\/tt>\u00a0\u901a\u8fc7<tt>troop<\/tt>\u00a0\u5c5e\u6027\u548c<tt>Soldier<\/tt>\u5efa\u7acb\u4e86\u4e00\u5bf9\u591a\u7684\u53cc\u5411\u5173\u8054. \u5728<tt>mappedBy<\/tt>\u7aef\u4e0d\u5fc5\u4e5f\u4e0d\u80fd\u518d\u5b9a\u4e49\u4efb\u4f55\u7269\u7406\u6620\u5c04<\/p>\n<p>\u5bf9\u4e8e\u4e00\u5bf9\u591a\u7684\u53cc\u5411\u6620\u5c04,\u5982\u679c\u8981\u4e00\u5bf9\u591a\u8fd9\u4e00\u7aef\u7ef4\u62a4\u5173\u8054\u5173\u7cfb, \u4f60\u9700\u8981\u5220\u9664<tt>mappedBy<\/tt>\u5143\u7d20\u5e76\u5c06\u591a\u5bf9\u4e00\u8fd9\u7aef\u7684\u00a0<tt>@JoinColumn<\/tt>\u7684insertable\u548cupdatable\u8bbe\u7f6e\u4e3afalse. \u5f88\u660e\u663e,\u8fd9\u79cd\u65b9\u6848\u4e0d\u4f1a\u5f97\u5230\u4ec0\u4e48\u660e\u663e\u7684\u4f18\u5316,\u800c\u4e14\u8fd8\u4f1a\u589e\u52a0\u4e00\u4e9b\u9644\u52a0\u7684UPDATE\u8bed\u53e5.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Troop\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToMany\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"troop_fk\")\u00a0\/\/we\u00a0need\u00a0to\u00a0duplicate\u00a0the\u00a0physical\u00a0information\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Soldier&gt;\u00a0getSoldiers()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Soldier\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"troop_fk\",\u00a0insertable=false,\u00a0updatable=false)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Troop\u00a0getTroop()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<h6><a name=\"d0e1526\"><\/a>2.2.5.3.2.2.\u00a0\u5355\u5411(Unidirectional)<\/h6>\n<p>\u901a\u8fc7\u5728\u88ab\u62e5\u6709\u7684\u5b9e\u4f53\u7aef(owned entity)\u589e\u52a0\u4e00\u4e2a\u5916\u952e\u5217\u6765\u5b9e\u73b0\u4e00\u5bf9\u591a\u5355\u5411\u5173\u8054\u662f\u5f88\u5c11\u89c1\u7684,\u4e5f\u662f\u4e0d\u63a8\u8350\u7684. \u6211\u4eec\u5f3a\u70c8\u5efa\u8bae\u901a\u8fc7\u4e00\u4e2a\u8054\u63a5\u8868(join table)\u6765\u5b9e\u73b0\u8fd9\u79cd\u5173\u8054(\u4e0b\u4e00\u8282\u4f1a\u5bf9\u6b64\u8fdb\u884c\u89e3\u91ca). \u53ef\u4ee5\u901a\u8fc7<tt>@JoinColumn<\/tt>\u6ce8\u89e3\u6765\u63cf\u8ff0\u8fd9\u79cd\u5355\u5411\u5173\u8054\u5173\u7cfb.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Customer\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToMany(cascade=CascadeType.ALL,\u00a0fetch=FetchType.EAGER)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"CUST_ID\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Ticket&gt;\u00a0getTickets()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Ticket\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\/\/no\u00a0bidir\u00a0}<\/pre>\n<p><tt>Customer<\/tt>\u00a0\u901a\u8fc7\u00a0<tt>CUST_ID<\/tt>\u5217\u548c<tt>Ticket<\/tt>\u00a0\u5efa\u7acb\u4e86\u5355\u5411\u5173\u8054\u5173\u7cfb.<\/p>\n<h6><a name=\"d0e1546\"><\/a>2.2.5.3.2.3.\u00a0\u901a\u8fc7\u5173\u8054\u8868\u5904\u7406\u5355\u5411\u5173\u8054<\/h6>\n<p>\u901a\u8fc7\u8054\u63a5\u8868\u5904\u7406\u5355\u5411\u4e00\u5bf9\u591a\u5173\u8054\u662f\u9996\u9009\u65b9\u5f0f.\u8fd9\u79cd\u5173\u8054\u901a\u8fc7<tt>@JoinTable<\/tt>\u6ce8\u89e3\u6765\u8fdb\u884c\u63cf\u8ff0.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Trainer\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToMany\u00a0\u00a0\u00a0\u00a0\u00a0@JoinTable(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"TrainedMonkeys\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0joinColumns\u00a0=\u00a0@JoinColumn(\u00a0name=\"trainer_id\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0inverseJoinColumns\u00a0=\u00a0@JoinColumn(\u00a0name=\"monkey_id\")\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Monkey&gt;\u00a0getTrainedMonkeys()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Monkey\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\/\/no\u00a0bidir\u00a0}<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>Trainer<\/tt>\u901a\u8fc7\u00a0<tt>TrainedMonkeys<\/tt>\u8868\u548c\u00a0<tt>Monkey<\/tt>\u00a0\u5efa\u7acb\u4e86\u5355\u5411\u5173\u8054. \u5176\u4e2d\u5916\u952e<tt>trainer_id<\/tt>\u5173\u8054\u5230<tt>Trainer<\/tt>\u00a0(<tt>joinColumns<\/tt>), \u800c\u5916\u952e<tt>monkey_id<\/tt>\u5173\u8054\u5230\u00a0<tt>Monkey<\/tt>\u00a0(<tt>inversejoinColumns<\/tt>).<\/p>\n<h6><a name=\"d0e1585\"><\/a>2.2.5.3.2.4.\u00a0\u9ed8\u8ba4\u5904\u7406\u673a\u5236<\/h6>\n<p>\u901a\u8fc7\u8054\u63a5\u8868\u6765\u5efa\u7acb\u5355\u5411\u4e00\u5bf9\u591a\u5173\u8054\u4e0d\u9700\u8981\u63cf\u8ff0\u4efb\u4f55\u7269\u7406\u6620\u5c04. \u8868\u540d\u7531\u4ee5\u4e0b\u4e09\u4e2a\u90e8\u5206\u7ec4\u6210:\u4e3b\u8868(owner table)\u8868\u540d+\u4e0b\u5212\u7ebf+\u4ece\u8868(the other side table)\u8868\u540d. \u6307\u5411\u4e3b\u8868\u7684\u5916\u952e\u540d\uff1a\u4e3b\u8868\u8868\u540d+\u4e0b\u5212\u7ebf+\u4e3b\u8868\u4e3b\u952e\u5217\u540d \u6307\u5411\u4ece\u8868\u7684\u5916\u952e\u540d\uff1a\u4e3b\u8868\u6240\u5bf9\u5e94\u5b9e\u4f53\u7684\u5c5e\u6027\u540d+\u4e0b\u5212\u7ebf+\u4ece\u8868\u4e3b\u952e\u5217\u540d \u6307\u5411\u4ece\u8868\u7684\u5916\u952e\u5b9a\u4e49\u4e3a\u552f\u4e00\u7ea6\u675f,\u7528\u6765\u8868\u793a\u4e00\u5bf9\u591a\u7684\u5173\u8054\u5173\u7cfb.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Trainer\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@OneToMany\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Tiger&gt;\u00a0getTrainedTigers()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Tiger\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\/\/no\u00a0bidir\u00a0}<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>Trainer<\/tt>\u548c<tt>Tiger<\/tt>\u00a0\u901a\u8fc7\u8054\u63a5\u8868\u00a0<tt>Trainer_Tiger<\/tt>\u5efa\u7acb\u5355\u5411\u5173\u8054\u5173\u7cfb, \u5176\u4e2d\u5916\u952e<tt>trainer_id<\/tt>\u5173\u8054\u5230<tt>Trainer<\/tt>\u00a0(\u4e3b\u8868\u8868\u540d,\u00a0<strong>_<\/strong>(\u4e0b\u5212\u7ebf), trainer id), \u800c\u5916\u952e<tt>trainedTigers_id<\/tt>\u5173\u8054\u5230<tt>Tiger<\/tt>\u00a0(\u5c5e\u6027\u540d\u79f0,\u00a0<strong>_<\/strong>(\u4e0b\u5212\u7ebf), Tiger\u8868\u7684\u4e3b\u952e\u5217\u540d).<\/p>\n<h5><a name=\"d0e1621\"><\/a>2.2.5.3.3.\u00a0\u591a\u5bf9\u591a(Many-to-many)<\/h5>\n<h6><a name=\"d0e1624\"><\/a>2.2.5.3.3.1.\u00a0\u5b9a\u4e49<\/h6>\n<p>\u4f60\u53ef\u4ee5\u901a\u8fc7<tt>@ManyToMany<\/tt>\u6ce8\u89e3\u53ef\u5b9a\u4e49\u7684\u591a\u5bf9\u591a\u5173\u8054. \u540c\u65f6,\u4f60\u4e5f\u9700\u8981\u901a\u8fc7\u6ce8\u89e3<tt>@JoinTable<\/tt>\u63cf\u8ff0\u5173\u8054\u8868\u548c\u5173\u8054\u6761\u4ef6. \u5982\u679c\u662f\u53cc\u5411\u5173\u8054,\u5176\u4e2d\u4e00\u6bb5\u5fc5\u987b\u5b9a\u4e49\u4e3aowner,\u53e6\u4e00\u7aef\u5fc5\u987b\u5b9a\u4e49\u4e3ainverse(\u5728\u5bf9\u5173\u8054\u8868\u8fdb\u884c\u66f4\u65b0\u64cd\u4f5c\u65f6\u8fd9\u4e00\u7aef\u5c06\u88ab\u5ffd\u7565):<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Employer\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToMany(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cascade={CascadeType.PERSIST,\u00a0CascadeType.MERGE}\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinTable(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"EMPLOYER_EMPLOYEE\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0joinColumns=@JoinColumn(name=\"EMPER_ID\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0inverseJoinColumns=@JoinColumn(name=\"EMPEE_ID\")\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Collection\u00a0getEmployees()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0employees;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<pre>@Entity\u00a0public\u00a0class\u00a0Employee\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToMany(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cascade\u00a0=\u00a0{CascadeType.PERSIST,\u00a0CascadeType.MERGE},\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mappedBy\u00a0=\u00a0\"employees\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0targetEntity\u00a0=\u00a0Employer.class\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Collection\u00a0getEmployers()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0employers;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<p>\u81f3\u6b64,\u6211\u4eec\u5df2\u7ecf\u5c55\u793a\u4e86\u5f88\u591a\u8ddf\u5173\u8054\u6709\u5173\u7684\u58f0\u660e\u5b9a\u4e49\u4ee5\u53ca\u5c5e\u6027\u7ec6\u8282. \u4e0b\u9762\u6211\u4eec\u5c06\u6df1\u5165\u4ecb\u7ecd<tt>@JoinTable<\/tt>\u6ce8\u89e3,\u8be5\u6ce8\u89e3\u5b9a\u4e49\u4e86\u8054\u63a5\u8868\u7684\u8868\u540d, \u8054\u63a5\u5217\u6570\u7ec4(\u6ce8\u89e3\u4e2d\u5b9a\u4e49\u6570\u7ec4\u7684\u683c\u5f0f\u4e3a{ A, B, C }), \u4ee5\u53cainverse\u8054\u63a5\u5217\u6570\u7ec4. \u540e\u8005\u662f\u5173\u8054\u8868\u4e2d\u5173\u8054\u5230<tt>Employee<\/tt>\u4e3b\u952e\u7684\u5217(the &#8220;other side&#8221;).<\/p>\n<p>\u6b63\u5982\u524d\u9762\u6240\u793a,\u88ab\u5173\u8054\u7aef\u4e0d\u5fc5\u4e5f\u4e0d\u80fd\u63cf\u8ff0\u7269\u7406\u6620\u5c04: \u53ea\u9700\u8981\u4e00\u4e2a\u7b80\u5355\u7684<tt>mappedBy<\/tt>\u53c2\u6570,\u8be5\u53c2\u6570\u5305\u542b\u4e86\u4e3b\u4f53\u7aef\u7684\u5c5e\u6027\u540d,\u8fd9\u6837\u5c31\u7ed1\u5b9a\u53cc\u65b9\u7684\u5173\u7cfb.<\/p>\n<h6><a name=\"d0e1652\"><\/a>2.2.5.3.3.2.\u00a0\u9ed8\u8ba4\u503c<\/h6>\n<p>\u548c\u5176\u4ed6\u8bb8\u591a\u6ce8\u89e3\u4e00\u6837,\u5728\u591a\u5bf9\u591a\u5173\u8054\u4e2d\u5f88\u591a\u503c\u662f\u81ea\u52a8\u751f\u6210. \u5f53\u53cc\u5411\u591a\u5bf9\u591a\u5173\u8054\u4e2d\u6ca1\u6709\u5b9a\u4e49\u4efb\u4f55\u7269\u7406\u6620\u5c04\u65f6,Hibernate\u6839\u636e\u4ee5\u4e0b\u89c4\u5219\u751f\u6210\u76f8\u5e94\u7684\u503c. \u5173\u8054\u8868\u540d:\u4e3b\u8868\u8868\u540d+<strong>_<\/strong>\u4e0b\u5212\u7ebf+\u4ece\u8868\u8868\u540d, \u5173\u8054\u5230\u4e3b\u8868\u7684\u5916\u952e\u540d:\u4e3b\u8868\u540d+<strong>_<\/strong>\u4e0b\u5212\u7ebf+\u4e3b\u8868\u4e2d\u7684\u4e3b\u952e\u5217\u540d. \u5173\u8054\u5230\u4ece\u8868\u7684\u5916\u952e\u540d:\u4e3b\u8868\u4e2d\u7528\u4e8e\u5173\u8054\u7684\u5c5e\u6027\u540d+<strong>_<\/strong>\u4e0b\u5212\u7ebf+\u4ece\u8868\u7684\u4e3b\u952e\u5217\u540d. \u4ee5\u4e0a\u89c4\u5219\u5bf9\u4e8e\u53cc\u5411\u4e00\u5bf9\u591a\u5173\u8054\u540c\u6837\u6709\u6548.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Store\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToMany(cascade\u00a0=\u00a0CascadeType.PERSIST)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;City&gt;\u00a0getImplantedIn()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0City\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\/\/no\u00a0bidirectional\u00a0relationship\u00a0}<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>Store_Table<\/tt>\u4f5c\u4e3a\u8054\u63a5\u8868.\u00a0<tt>Store_id<\/tt>\u5217\u662f\u8054\u63a5\u5230<tt>Store<\/tt>\u8868\u7684\u5916\u952e. \u800c<tt>implantedIn_id<\/tt>\u5217\u5219\u8054\u63a5\u5230<tt>City<\/tt>\u8868.<\/p>\n<p>\u5f53\u53cc\u5411\u591a\u5bf9\u591a\u5173\u8054\u4e2d\u6ca1\u6709\u5b9a\u4e49\u4efb\u4f55\u7269\u7406\u6620\u5c04\u65f6, Hibernate\u6839\u636e\u4ee5\u4e0b\u89c4\u5219\u751f\u6210\u76f8\u5e94\u7684\u503c \u5173\u8054\u8868\u540d: :\u4e3b\u8868\u8868\u540d+<strong>_<\/strong>\u4e0b\u5212\u7ebf+\u4ece\u8868\u8868\u540d, \u5173\u8054\u5230\u4e3b\u8868\u7684\u5916\u952e\u540d:\u4ece\u8868\u7528\u4e8e\u5173\u8054\u7684\u5c5e\u6027\u540d+<strong>_<\/strong>\u4e0b\u5212\u7ebf+\u4e3b\u8868\u4e2d\u7684\u4e3b\u952e\u5217\u540d. \u5173\u8054\u5230\u4ece\u8868\u7684\u5916\u952e\u540d:\u4e3b\u8868\u7528\u4e8e\u5173\u8054\u7684\u5c5e\u6027\u540d+<strong>_<\/strong>\u4e0b\u5212\u7ebf+\u4ece\u8868\u7684\u4e3b\u952e\u5217\u540d. \u4ee5\u4e0a\u89c4\u5219\u5bf9\u4e8e\u53cc\u5411\u4e00\u5bf9\u591a\u5173\u8054\u540c\u6837\u6709\u6548.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Store\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToMany(cascade\u00a0=\u00a0{CascadeType.PERSIST,\u00a0CascadeType.MERGE})\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Customer&gt;\u00a0getCustomers()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}\u00a0@Entity\u00a0public\u00a0class\u00a0Customer\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToMany(mappedBy=\"customers\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Store&gt;\u00a0getStores()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<p>\u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>Store_Customer<\/tt>\u4f5c\u4e3a\u8054\u63a5\u8868.\u00a0<tt>stores_id<\/tt>\u5217\u662f\u8054\u63a5\u5230<tt>Store<\/tt>\u8868\u7684\u5916\u952e, \u800c<tt>customers_id<\/tt>\u5217\u8054\u63a5\u5230<tt>City<\/tt>\u8868.<\/p>\n<h4><a name=\"d0e1715\"><\/a>2.2.5.4.\u00a0\u7528cascading\u5b9e\u73b0\u4f20\u64ad\u6027\u6301\u4e45\u5316(Transitive persistence)<\/h4>\n<p>\u4e5f\u8bb8\u4f60\u5df2\u7ecf\u6ce8\u610f\u5230\u4e86<tt>cascade<\/tt>\u5c5e\u6027\u63a5\u53d7\u7684\u503c\u4e3a<tt>CascadeType<\/tt>\u6570\u7ec4. \u5728EJB3\u4e2d\u7684cascade\u7684\u6982\u5ff5\u548cHibernate\u4e2d\u7684\u4f20\u64ad\u6027\u6301\u4e45\u5316\u4ee5\u53cacascade\u64cd\u4f5c\u975e\u5e38\u7c7b\u4f3c, \u4f46\u662f\u5728\u8bed\u4e49\u4e0a\u6709\u7ec6\u5fae\u7684\u533a\u522b,\u652f\u6301\u7684cascade\u7c7b\u578b\u4e5f\u6709\u70b9\u533a\u522b:<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>CascadeType.PERSIST: \u5982\u679c\u4e00\u4e2a\u5b9e\u4f53\u662f\u53d7\u7ba1\u72b6\u6001, \u6216\u8005\u5f53persist()\u51fd\u6570\u88ab\u8c03\u7528\u65f6, \u89e6\u53d1\u7ea7\u8054\u521b\u5efa(create)\u64cd\u4f5c<\/li>\n<li>CascadeType.MERGE: \u5982\u679c\u4e00\u4e2a\u5b9e\u4f53\u662f\u53d7\u7ba1\u72b6\u6001, \u6216\u8005\u5f53merge()\u51fd\u6570\u88ab\u8c03\u7528\u65f6, \u89e6\u53d1\u7ea7\u8054\u5408\u5e76(merge)\u64cd\u4f5c<\/li>\n<li>CascadeType.REMOVE: \u5f53delete()\u51fd\u6570\u88ab\u8c03\u7528\u65f6, \u89e6\u53d1\u7ea7\u8054\u5220\u9664(remove)\u64cd\u4f5c<\/li>\n<li>CascadeType.REFRESH: \u5f53refresh()\u51fd\u6570\u88ab\u8c03\u7528\u65f6, \u89e6\u53d1\u7ea7\u8054\u66f4\u65b0(refresh)\u64cd\u4f5c<\/li>\n<li>CascadeType.ALL: \u4ee5\u4e0a\u5168\u90e8<\/li>\n<\/ul>\n<p>\u5173\u4e8ecascading, create\/merge\u7684\u8bed\u4e49\u8bf7\u53c2\u8003EJB3\u89c4\u8303\u76846.3\u7ae0\u8282.<\/p>\n<h4><a name=\"d0e1739\"><\/a>2.2.5.5.\u00a0\u5173\u8054\u5173\u7cfb\u83b7\u53d6<\/h4>\n<p>\u901a\u8fc7Hibernate\u4f60\u53ef\u4ee5\u83b7\u5f97\u76f4\u63a5\u6216\u8005\u5ef6\u8fdf\u83b7\u53d6\u5173\u8054\u5b9e\u4f53\u7684\u529f\u80fd.\u00a0<tt>fetch<\/tt>\u53c2\u6570\u53ef\u4ee5\u8bbe\u7f6e\u4e3a<tt>FetchType.LAZY<\/tt>\u00a0\u6216\u8005\u00a0<tt>FetchType.EAGER<\/tt>.\u00a0<tt>EAGER<\/tt>\u901a\u8fc7<tt>outer join select<\/tt>\u76f4\u63a5\u83b7\u53d6\u5173\u8054\u7684\u5bf9\u8c61, \u800c<tt>LAZY<\/tt>(\u9ed8\u8ba4\u503c)\u5728\u7b2c\u4e00\u6b21\u8bbf\u95ee\u5173\u8054\u5bf9\u8c61\u7684\u65f6\u5019\u624d\u4f1a\u89e6\u53d1\u76f8\u5e94\u7684select\u64cd\u4f5c. EJBQL\u63d0\u4f9b\u4e86<tt>fetch<\/tt>\u5173\u952e\u5b57,\u8be5\u5173\u952e\u5b57\u53ef\u4ee5\u5728\u8fdb\u884c\u7279\u6b8a\u67e5\u8be2\u7684\u65f6\u5019\u8986\u76d6\u9ed8\u8ba4\u503c. \u8fd9\u5bf9\u4e8e\u63d0\u9ad8\u6027\u80fd\u6765\u8bf4\u975e\u5e38\u6709\u6548,\u5e94\u8be5\u6839\u636e\u5b9e\u9645\u7684\u7528\u4f8b\u6765\u5224\u65ad\u662f\u5426\u9009\u62e9fetch\u5173\u952e\u5b57.<\/p>\n<h3><a name=\"d0e1765\"><\/a>2.2.6.\u00a0\u6620\u5c04\u590d\u5408\u4e3b\u952e\u4e0e\u5916\u952e<\/h3>\n<p>\u7ec4\u5408\u4e3b\u952e\u4f7f\u7528\u4e00\u4e2a\u53ef\u5d4c\u5165\u7684\u7c7b\u4f5c\u4e3a\u4e3b\u952e\u8868\u793a,\u56e0\u6b64\u4f60\u9700\u8981\u4f7f\u7528<tt>@Id<\/tt>\u00a0\u548c<tt>@Embeddable<\/tt>\u4e24\u4e2a\u6ce8\u89e3. \u8fd8\u6709\u4e00\u79cd\u65b9\u5f0f\u662f\u4f7f\u7528<tt>@EmbeddedId<\/tt>\u6ce8\u89e3.\u6ce8\u610f\u6240\u4f9d\u8d56\u7684\u7c7b\u5fc5\u987b\u5b9e\u73b0 serializable\u4ee5\u53ca\u5b9e\u73b0<tt>equals()<\/tt>\/<tt>hashCode()<\/tt>\u65b9\u6cd5. \u4f60\u4e5f\u53ef\u4ee5\u5982<a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#mapping-identifier\">Mapping identifier properties<\/a>\u4e00\u7ae0\u4e2d\u63cf\u8ff0\u7684\u529e\u6cd5\u4f7f\u7528<tt>@IdClass<\/tt>\u6ce8\u89e3.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0RegionalArticle\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0RegionalArticlePk\u00a0getPk()\u00a0{\u00a0...\u00a0}\u00a0}\u00a0@Embeddable\u00a0public\u00a0class\u00a0RegionalArticlePk\u00a0implements\u00a0Serializable\u00a0{\u00a0...\u00a0}<\/pre>\n<p>\u6216\u8005<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0RegionalArticle\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@EmbeddedId\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0RegionalArticlePk\u00a0getPk()\u00a0{\u00a0...\u00a0}\u00a0}\u00a0public\u00a0class\u00a0RegionalArticlePk\u00a0implements\u00a0Serializable\u00a0{\u00a0...\u00a0}<\/pre>\n<p><tt>@Embeddable<\/tt>\u00a0\u6ce8\u89e3\u9ed8\u8ba4\u7ee7\u627f\u4e86\u5176\u6240\u5c5e\u5b9e\u4f53\u7684\u8bbf\u95ee\u7c7b\u578b, \u9664\u975e\u663e\u5f0f\u4f7f\u7528\u4e86Hibernate\u7684<tt>@AccessType<\/tt>\u6ce8\u89e3(\u8fd9\u4e2a\u6ce8\u89e3\u4e0d\u662fEJB3\u6807\u51c6\u7684\u4e00\u90e8\u5206). \u800c<tt>@JoinColumns<\/tt>,\u5373<tt>@JoinColumn<\/tt>\u6570\u7ec4, \u5b9a\u4e49\u4e86\u5173\u8054\u7684\u7ec4\u5408\u5916\u952e(\u5982\u679c\u4e0d\u4f7f\u7528\u7f3a\u7701\u503c\u7684\u8bdd). \u663e\u5f0f\u6307\u660e<tt>referencedColumnNames<\/tt>\u662f\u4e00\u4e2a\u597d\u7684\u5b9e\u8df5\u65b9\u5f0f, \u5426\u5219,Hibernate\u8ba4\u4e3a\u4f60\u4f7f\u7528\u7684\u5217\u987a\u5e8f\u548c\u4e3b\u952e\u58f0\u660e\u7684\u987a\u5e8f\u4e00\u81f4.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Parent\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0ParentPk\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0int\u00a0age;\u00a0\u00a0\u00a0\u00a0\u00a0@OneToMany(cascade=CascadeType.ALL)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumns\u00a0({\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"parentCivility\",\u00a0referencedColumnName\u00a0=\u00a0\"isMale\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"parentLastName\",\u00a0referencedColumnName\u00a0=\u00a0\"lastName\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"parentFirstName\",\u00a0referencedColumnName\u00a0=\u00a0\"firstName\")\u00a0\u00a0\u00a0\u00a0\u00a0})\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Child&gt;\u00a0children;\u00a0\/\/unidirectional\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<pre>@Entity\u00a0public\u00a0class\u00a0Child\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0@GeneratedValue\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Integer\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumns\u00a0({\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"parentCivility\",\u00a0referencedColumnName\u00a0=\u00a0\"isMale\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"parentLastName\",\u00a0referencedColumnName\u00a0=\u00a0\"lastName\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"parentFirstName\",\u00a0referencedColumnName\u00a0=\u00a0\"firstName\")\u00a0\u00a0\u00a0\u00a0\u00a0})\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Parent\u00a0parent;\u00a0\/\/unidirectional\u00a0}<\/pre>\n<pre>@Embeddable\u00a0public\u00a0class\u00a0ParentPk\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0firstName;\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0lastName;\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u6ce8\u610f\u4e0a\u9762\u7684\u00a0<tt>referencedColumnName<\/tt>\u663e\u5f0f\u4f7f\u7528\u65b9\u5f0f.<\/p>\n<h3><a name=\"d0e1823\"><\/a>2.2.7.\u00a0\u6620\u5c04\u4e8c\u7ea7\u8868(secondary tables)<\/h3>\n<p>\u4f7f\u7528\u7c7b\u4e00\u7ea7\u7684\u00a0<tt>@SecondaryTable\u00a0<\/tt>\u6216\u00a0<tt>@SecondaryTables\u00a0<\/tt>\u6ce8\u89e3\u53ef\u4ee5\u5b9e\u73b0\u5355\u4e2a\u5b9e\u4f53\u5230\u591a\u4e2a\u8868\u7684\u6620\u5c04. \u4f7f\u7528\u00a0<tt>@Column\u00a0<\/tt>\u6216\u8005\u00a0<tt>@JoinColumn\u00a0<\/tt>\u6ce8\u89e3\u4e2d\u7684\u00a0<tt>table\u00a0<\/tt>\u53c2\u6570\u53ef\u6307\u5b9a\u67d0\u4e2a\u5217\u6240\u5c5e\u7684\u7279\u5b9a\u8868.<\/p>\n<pre>@Entity\u00a0@Table(name=\"MainCat\")\u00a0@SecondaryTables({\u00a0\u00a0\u00a0\u00a0\u00a0@SecondaryTable(name=\"Cat1\",\u00a0pkJoinColumns={\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@PrimaryKeyJoinColumn(name=\"cat_id\",\u00a0referencedColumnName=\"id\")\u00a0\u00a0\u00a0\u00a0\u00a0),\u00a0\u00a0\u00a0\u00a0\u00a0@SecondaryTable(name=\"Cat2\",\u00a0uniqueConstraints={@UniqueConstraint(columnNames={\"storyPart2\"})})\u00a0})\u00a0public\u00a0class\u00a0Cat\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Integer\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0storyPart1;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0storyPart2;\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0@GeneratedValue\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Integer\u00a0getId()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getName()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Column(table=\"Cat1\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getStoryPart1()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0storyPart1;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@Column(table=\"Cat2\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getStoryPart2()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0storyPart2;\u00a0\u00a0\u00a0\u00a0\u00a0}<\/pre>\n<p>\u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>name<\/tt>\u4fdd\u5b58\u5728<tt>MainCat<\/tt>\u8868\u4e2d,\u00a0<tt>storyPart1<\/tt>\u4fdd\u5b58\u5728<tt>Cat1<\/tt>\u8868\u4e2d,\u00a0<tt>storyPart2<\/tt>\u4fdd\u5b58\u5728<tt>Cat2<\/tt>\u8868\u4e2d.\u00a0<tt>Cat1<\/tt>\u8868\u901a\u8fc7\u5916\u952e<tt>cat_id<\/tt>\u548c<tt>MainCat<\/tt>\u8868\u5173\u8054,\u00a0<tt>Cat2<\/tt>\u8868\u901a\u8fc7<tt>id<\/tt>\u5217\u548c<tt>MainCat<\/tt>\u8868\u5173\u8054 (\u548c<tt>MainCat<\/tt>\u7684<tt>id<\/tt>\u5217\u540c\u540d). \u5bf9<tt>storyPart2<\/tt>\u5217\u8fd8\u5b9a\u4e49\u4e86\u552f\u4e00\u7ea6\u675f.<\/p>\n<p>\u5728JBoss EJB 3\u6307\u5357\u548cHibernate Annotations\u5355\u5143\u6d4b\u8bd5\u4ee3\u7801\u4e2d\u8fd8\u6709\u66f4\u591a\u7684\u4f8b\u5b50.<\/p>\n<h2><a name=\"entity-mapping-query\"><\/a>2.3.\u00a0\u6620\u5c04\u67e5\u8be2<\/h2>\n<h3><a name=\"d0e1906\"><\/a>2.3.1.\u00a0\u6620\u5c04EJBQL\/HQL\u67e5\u8be2<\/h3>\n<p>\u4f7f\u7528\u6ce8\u89e3\u8fd8\u53ef\u4ee5\u6620\u5c04EJBQL\/HQL\u67e5\u8be2.\u00a0<tt>@NamedQuery<\/tt>\u00a0\u548c<tt>@NamedQueries<\/tt>\u662f\u53ef\u4f7f\u7528\u5728\u7c7b\u548c\u5305\u4e0a\u7684\u6ce8\u89e3. \u4f46\u662f\u5b83\u4eec\u7684\u5b9a\u4e49\u5728session factory\/entity manager factory\u8303\u56f4\u4e2d\u662f\u90fd\u53ef\u89c1\u7684. \u547d\u540d\u5f0f\u67e5\u8be2\u901a\u8fc7\u5b83\u7684\u540d\u5b57\u548c\u5b9e\u9645\u7684\u67e5\u8be2\u5b57\u7b26\u4e32\u6765\u5b9a\u4e49.<\/p>\n<pre>javax.persistence.NamedQueries(\u00a0\u00a0\u00a0\u00a0\u00a0@javax.persistence.NamedQuery(name=\"plane.getAll\",\u00a0query=\"select\u00a0p\u00a0from\u00a0Plane\u00a0p\")\u00a0)\u00a0package\u00a0org.hibernate.test.annotations.query;\u00a0...\u00a0@Entity\u00a0@NamedQuery(name=\"night.moreRecentThan\",\u00a0query=\"select\u00a0n\u00a0from\u00a0Night\u00a0n\u00a0where\u00a0n.date\u00a0&gt;=\u00a0:date\")\u00a0public\u00a0class\u00a0Night\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0public\u00a0class\u00a0MyDao\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0doStuff()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Query\u00a0q\u00a0=\u00a0s.getNamedQuery(\"night.moreRecentThan\");\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0q.setDate(\u00a0\"date\",\u00a0aMonthAgo\u00a0);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List\u00a0results\u00a0=\u00a0q.list();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u8fd8\u53ef\u4ee5\u901a\u8fc7\u5b9a\u4e49\u00a0<tt>QueryHint<\/tt>\u00a0\u6570\u7ec4\u7684<tt>hints<\/tt>\u00a0\u5c5e\u6027\u4e3a\u67e5\u8be2\u63d0\u4f9b\u4e00\u4e9bhint\u4fe1\u606f.<\/p>\n<p>\u4e0b\u9762\u662f\u76ee\u524d\u53ef\u4ee5\u4f7f\u7528\u7684\u4e00\u4e9bHibernate hint\uff1a<\/p>\n<p><a name=\"d0e1930\"><\/a><\/p>\n<p><strong>\u8868\u00a02.2.\u00a0Query hints<\/strong><\/p>\n<table summary=\"Query hints\">\n<colgroup>\n<col \/>\n<col \/><\/colgroup>\n<thead>\n<tr class=\"firstRow\">\n<th>hint<\/th>\n<th>description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>org.hibernate.cacheable<\/td>\n<td>\u67e5\u8be2\u662f\u5426\u4e0e\u4e8c\u7ea7\u7f13\u5b58\u4ea4\u4e92(\u9ed8\u8ba4\u503c\u4e3afalse)<\/td>\n<\/tr>\n<tr>\n<td>org.hibernate.cacheRegion<\/td>\n<td>\u8bbe\u7f6e\u7f13\u5b58\u533a\u540d\u79f0 (\u9ed8\u8ba4\u4e3aotherwise)<\/td>\n<\/tr>\n<tr>\n<td>org.hibernate.timeout<\/td>\n<td>\u67e5\u8be2\u8d85\u65f6\u8bbe\u5b9a<\/td>\n<\/tr>\n<tr>\n<td>org.hibernate.fetchSize<\/td>\n<td>\u6240\u83b7\u53d6\u7684\u7ed3\u679c\u96c6(resultset)\u5927\u5c0f<\/td>\n<\/tr>\n<tr>\n<td>org.hibernate.flushMode<\/td>\n<td>\u672c\u6b21\u67e5\u8be2\u6240\u7528\u7684\u5237\u65b0\u6a21\u5f0f<\/td>\n<\/tr>\n<tr>\n<td>org.hibernate.cacheMode<\/td>\n<td>\u672c\u6b21\u67e5\u8be2\u6240\u7528\u7684\u7f13\u5b58\u6a21\u5f0f<\/td>\n<\/tr>\n<tr>\n<td>org.hibernate.readOnly<\/td>\n<td>\u662f\u5426\u5c06\u672c\u6b21\u67e5\u8be2\u6240\u52a0\u8f7d\u7684\u5b9e\u4f53\u8bbe\u4e3a\u53ea\u8bfb(\u9ed8\u8ba4\u4e3afalse)<\/td>\n<\/tr>\n<tr>\n<td>org.hibernate.comment<\/td>\n<td>\u5c06\u67e5\u8be2\u6ce8\u91ca\u6dfb\u52a0\u5165\u6240\u751f\u6210\u7684SQL<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><a name=\"entity-mapping-query-native\"><\/a>2.3.2.\u00a0\u6620\u5c04\u672c\u5730\u5316\u67e5\u8be2<\/h3>\n<p>\u4f60\u8fd8\u53ef\u4ee5\u6620\u5c04\u672c\u5730\u5316\u67e5\u8be2(\u4e5f\u5c31\u662f\u666e\u901aSQL\u67e5\u8be2). \u4e0d\u8fc7\u8fd9\u9700\u8981\u4f60\u4f7f\u7528<tt>@SqlResultSetMapping<\/tt>\u6ce8\u89e3\u6765\u63cf\u8ff0SQL\u7684resultset\u7684\u7ed3\u6784 (\u5982\u679c\u4f60\u6253\u7b97\u5b9a\u4e49\u591a\u4e2a\u7ed3\u679c\u96c6\u6620\u5c04\uff0c\u53ef\u662f\u4f7f\u7528<tt>@SqlResultSetMappings<\/tt>).\u00a0<tt>@SqlResultSetMapping<\/tt>\u548c<tt>@NamedQuery<\/tt>,\u00a0<tt>@SqlResultSetMapping<\/tt>\u4e00\u6837,\u53ef\u4ee5\u5b9a\u4e49\u5728\u7c7b\u548c\u5305\u4e00\u7ea7. \u4f46\u662f<tt>@SqlResultSetMapping<\/tt>\u7684\u4f5c\u7528\u57df\u4e3a\u5e94\u7528\u7ea7. \u4e0b\u9762\u6211\u4eec\u4f1a\u770b\u5230,<tt>@NamedNativeQuery<\/tt>\u00a0\u6ce8\u89e3\u4e2d\u00a0<tt>resultSetMapping<\/tt>\u53c2\u6570\u503c\u4e3a<tt>@SqlResultSetMapping<\/tt>\u7684\u540d\u5b57. \u7ed3\u679c\u96c6\u6620\u5c04\u5b9a\u4e49\u4e86\u901a\u8fc7\u672c\u5730\u5316\u67e5\u8be2\u8fd4\u56de\u503c\u548c\u5b9e\u4f53\u7684\u6620\u5c04. \u8be5\u5b9e\u4f53\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5b57\u6bb5\u90fd\u7ed1\u5b9a\u5230SQL\u7ed3\u679c\u96c6\u4e2d\u7684\u67d0\u4e2a\u5217\u4e0a. \u8be5\u5b9e\u4f53\u7684\u6240\u6709\u5b57\u6bb5\u5305\u62ec\u5b50\u7c7b\u7684\u6240\u6709\u5b57\u6bb5\u4ee5\u53ca \u5173\u8054\u5b9e\u4f53\u7684\u5916\u952e\u5217\u90fd\u5fc5\u987b\u5728SQL\u67e5\u8be2\u4e2d\u6709\u5bf9\u5e94\u7684\u5b9a\u4e49. \u5982\u679c\u5b9e\u4f53\u4e2d\u7684\u5c5e\u6027\u548cSQL\u67e5\u8be2\u4e2d\u7684\u5217\u540d\u76f8\u540c,\u8fd9\u79cd\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e0d\u8fdb\u884c\u5b9a\u4e49\u5b57\u6bb5\u6620\u5c04.<\/p>\n<pre>@NamedNativeQuery(name=\"night&amp;area\",\u00a0query=\"select\u00a0night.id\u00a0nid,\u00a0night.night_duration,\u00a0\"\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0\"\u00a0night.night_date,\u00a0area.id\u00a0aid,\u00a0night.area_id,\u00a0area.name\u00a0\"\u00a0\u00a0\u00a0\u00a0\u00a0+\u00a0\"from\u00a0Night\u00a0night,\u00a0Area\u00a0area\u00a0where\u00a0night.area_id\u00a0=\u00a0area.id\",\u00a0resultSetMapping=\"joinMapping\")\u00a0@SqlResultSetMapping(name=\"joinMapping\",\u00a0entities={\u00a0\u00a0\u00a0\u00a0\u00a0@EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class,\u00a0fields\u00a0=\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"id\",\u00a0column=\"nid\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"duration\",\u00a0column=\"night_duration\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"date\",\u00a0column=\"night_date\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"area\",\u00a0column=\"area_id\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0discriminatorColumn=\"disc\"\u00a0\u00a0\u00a0\u00a0\u00a0}),\u00a0\u00a0\u00a0\u00a0\u00a0@EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class,\u00a0fields\u00a0=\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"id\",\u00a0column=\"aid\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"name\",\u00a0column=\"name\")\u00a0\u00a0\u00a0\u00a0\u00a0})\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0)<\/pre>\n<p>\u5728\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,\u540d\u4e3a<tt>night&amp;area<\/tt>\u7684\u67e5\u8be2 \u548c<tt>joinMapping<\/tt>\u7ed3\u679c\u96c6\u6620\u5c04\u5bf9\u5e94. \u8be5\u6620\u5c04\u8fd4\u56de\u4e24\u4e2a\u5b9e\u4f53,\u5206\u522b\u4e3a<tt>Night<\/tt>\u00a0\u548c<tt>Area<\/tt>,\u5176\u4e2d\u6bcf\u4e2a\u5c5e\u6027\u90fd\u548c\u4e00\u4e2a\u5217\u5173\u8054, \u5217\u540d\u901a\u8fc7\u67e5\u8be2\u83b7\u53d6.\u4e0b\u9762\u6211\u4eec\u770b\u4e00\u4e2a\u9690\u5f0f\u58f0\u660e\u5c5e\u6027\u548c\u5217\u6620\u5c04\u5173\u7cfb\u7684\u4f8b\u5b50.<\/p>\n<pre>@Entity\u00a0@SqlResultSetMapping(name=\"implicit\",\u00a0entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class))\u00a0@NamedNativeQuery(name=\"implicitSample\",\u00a0query=\"select\u00a0*\u00a0from\u00a0SpaceShip\",\u00a0resultSetMapping=\"implicit\")\u00a0public\u00a0class\u00a0SpaceShip\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0model;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0double\u00a0speed;\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getName()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setName(String\u00a0name)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.name\u00a0=\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@Column(name=\"model_txt\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getModel()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0model;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setModel(String\u00a0model)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.model\u00a0=\u00a0model;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0double\u00a0getSpeed()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0speed;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setSpeed(double\u00a0speed)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.speed\u00a0=\u00a0speed;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<p>\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,\u6211\u4eec\u53ea\u9700\u8981\u5b9a\u4e49\u7ed3\u679c\u96c6\u6620\u5c04\u4e2d\u7684\u5b9e\u4f53\u6210\u5458. \u5c5e\u6027\u548c\u5217\u540d\u4e4b\u95f4\u7684\u6620\u5c04\u501f\u52a9\u5b9e\u4f53\u4e2d\u5305\u542b\u6620\u5c04\u4fe1\u606f\u6765\u5b8c\u6210. \u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,<tt>model<\/tt>\u5c5e\u6027\u7ed1\u5b9a\u5230<tt>model_txt<\/tt>\u5217. \u5982\u679c\u548c\u76f8\u5173\u5b9e\u4f53\u7684\u5173\u8054\u8bbe\u8ba1\u5230\u7ec4\u5408\u4e3b\u952e, \u90a3\u4e48\u5e94\u8be5\u4f7f\u7528<tt>@FieldResult<\/tt>\u6ce8\u89e3\u6765\u5b9a\u4e49\u6bcf\u4e2a\u5916\u952e\u5217.<tt>@FieldResult<\/tt>\u7684\u540d\u5b57\u7531\u4ee5\u4e0b\u51e0\u90e8\u5206\u7ec4\u6210\uff1a \u5b9a\u4e49\u8fd9\u79cd\u5173\u7cfb\u7684\u5c5e\u6027\u540d\u5b57+&#8221;.&#8221;\uff0b\u4e3b\u952e\u540d\u6216\u4e3b\u952e\u5217\u6216\u4e3b\u952e\u5c5e\u6027.<\/p>\n<pre>@Entity\u00a0@SqlResultSetMapping(name=\"compositekey\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fields\u00a0=\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"name\",\u00a0column\u00a0=\u00a0\"name\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"model\",\u00a0column\u00a0=\u00a0\"model\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"speed\",\u00a0column\u00a0=\u00a0\"speed\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"captain.firstname\",\u00a0column\u00a0=\u00a0\"firstn\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"captain.lastname\",\u00a0column\u00a0=\u00a0\"lastn\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"dimensions.length\",\u00a0column\u00a0=\u00a0\"length\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@FieldResult(name=\"dimensions.width\",\u00a0column\u00a0=\u00a0\"width\")\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0columns\u00a0=\u00a0{\u00a0@ColumnResult(name\u00a0=\u00a0\"surface\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@ColumnResult(name\u00a0=\u00a0\"volume\")\u00a0}\u00a0)\u00a0@NamedNativeQuery(name=\"compositekey\",\u00a0\u00a0\u00a0\u00a0\u00a0query=\"select\u00a0name,\u00a0model,\u00a0speed,\u00a0lname\u00a0as\u00a0lastn,\u00a0fname\u00a0as\u00a0firstn,\u00a0length,\u00a0width,\u00a0length\u00a0*\u00a0width\u00a0as\u00a0surface\u00a0from\u00a0SpaceShip\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0resultSetMapping=\"compositekey\")\u00a0}\u00a0)\u00a0public\u00a0class\u00a0SpaceShip\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0model;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0double\u00a0speed;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Captain\u00a0captain;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Dimensions\u00a0dimensions;\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getName()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setName(String\u00a0name)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.name\u00a0=\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne(fetch=\u00a0FetchType.LAZY)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumns(\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"fname\",\u00a0referencedColumnName\u00a0=\u00a0\"firstname\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"lname\",\u00a0referencedColumnName\u00a0=\u00a0\"lastname\")\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Captain\u00a0getCaptain()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0captain;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setCaptain(Captain\u00a0captain)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.captain\u00a0=\u00a0captain;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getModel()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0model;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setModel(String\u00a0model)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.model\u00a0=\u00a0model;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0double\u00a0getSpeed()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0speed;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setSpeed(double\u00a0speed)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.speed\u00a0=\u00a0speed;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Dimensions\u00a0getDimensions()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0dimensions;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setDimensions(Dimensions\u00a0dimensions)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.dimensions\u00a0=\u00a0dimensions;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}\u00a0@Entity\u00a0@IdClass(Identity.class)\u00a0public\u00a0class\u00a0Captain\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0firstname;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0lastname;\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getFirstname()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0firstname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setFirstname(String\u00a0firstname)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.firstname\u00a0=\u00a0firstname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getLastname()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0lastname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setLastname(String\u00a0lastname)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.lastname\u00a0=\u00a0lastname;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u89c2\u5bdfdimension\u5c5e\u6027\u4f60\u4f1a\u53d1\u73b0Hibernate\u652f\u6301\u7528&#8221;.&#8221;\u7b26\u53f7\u6765\u8868\u793a\u5d4c\u5165\u5f0f\u5bf9\u8c61. EJB3\u5b9e\u73b0\u4e0d\u5fc5\u652f\u6301\u8fd9\u4e2a\u7279\u5f81,\u4f46\u662f\u6211\u4eec\u505a\u5230\u4e86:-)<\/p>\n<p>\u5982\u679c\u67e5\u8be2\u8fd4\u56de\u7684\u662f\u5355\u4e2a\u5b9e\u4f53,\u6216\u8005\u4f60\u6253\u7b97\u4f7f\u7528\u7cfb\u7edf\u9ed8\u8ba4\u7684\u6620\u5c04, \u8fd9\u79cd\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e0d\u4f7f\u7528<tt>resultSetMapping<\/tt>\u00a0\u800c\u662f\u4f7f\u7528<tt>resultClass<\/tt>\u5c5e\u6027:<\/p>\n<pre>@NamedNativeQuery(name=\"implicitSample\",\u00a0query=\"select\u00a0*\u00a0from\u00a0SpaceShip\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0resultClass=SpaceShip.class)\u00a0public\u00a0class\u00a0SpaceShip\u00a0{<\/pre>\n<p>\u67d0\u4e9b\u672c\u5730\u67e5\u8be2\u8fd4\u56de\u7684\u662fscalar\u503c,\u4f8b\u5982\u62a5\u8868\u67e5\u8be2. \u4f60\u53ef\u4ee5\u901a\u8fc7<tt>@ColumnResult<\/tt>\u5c06\u5176\u6620\u5c04\u5230\u00a0<tt>@SqlResultsetMapping<\/tt>\u4e0a. \u751a\u81f3\u8fd8\u53ef\u4ee5\u5728\u540c\u4e00\u4e2a\u672c\u5730\u67e5\u8be2\u7684\u7ed3\u679c\u4e2d\u6df7\u5408\u5b9e\u4f53\u548cscalar\u7c7b\u578b(\u4e0d\u8fc7\u8fd9\u79cd\u60c5\u51b5\u6bd4\u8f83\u5c11\u89c1).<\/p>\n<pre>@SqlResultSetMapping(name=\"scalar\",\u00a0columns=@ColumnResult(name=\"dimension\"))\u00a0@NamedNativeQuery(name=\"scalar\",\u00a0query=\"select\u00a0length*width\u00a0as\u00a0dimension\u00a0from\u00a0SpaceShip\",\u00a0resultSetMapping=\"scalar\")<\/pre>\n<p>\u672c\u5730\u67e5\u8be2\u4e2d\u8fd8\u6709\u53e6\u5916\u4e00\u4e2ahint\u5c5e\u6027\uff1a\u00a0<tt>org.hibernate.callable<\/tt>. \u8fd9\u4e2a\u5c5e\u6027\u7684\u5e03\u5c14\u53d8\u91cf\u503c\u8868\u660e\u8fd9\u4e2a\u67e5\u8be2\u662f\u5426\u662f\u4e00\u4e2a\u5b58\u50a8\u8fc7\u7a0b.<\/p>\n<h2><a name=\"entity-hibspec\"><\/a>2.4.\u00a0Hibernate\u72ec\u6709\u7684\u6ce8\u89e3\u6269\u5c55<\/h2>\n<p>Hibernate 3.1 \u63d0\u4f9b\u4e86\u591a\u79cd\u9644\u52a0\u7684\u6ce8\u89e3,\u8fd9\u4e9b\u6ce8\u89e3\u53ef\u4ee5\u4e0eEJB3\u7684\u5b9e\u4f53\u6df7\u5408\/\u5339\u914d\u4f7f\u7528. \u4ed6\u4eec\u88ab\u8bbe\u8ba1\u6210EJB3\u6ce8\u89e3\u7684\u81ea\u7136\u6269\u5c55.<\/p>\n<p>\u4e3a\u4e86\u5f3a\u5316EJB3\u7684\u80fd\u529b,Hibernate\u63d0\u4f9b\u4e86\u4e0e\u5176\u81ea\u8eab\u7279\u6027\u76f8\u543b\u5408\u7684\u7279\u6b8a\u6ce8\u89e3.\u00a0<tt>org.hibernate.annotations<\/tt>\u5305\u5df2\u5305\u542b\u4e86\u6240\u6709\u7684\u8fd9\u4e9b\u6ce8\u89e3\u6269\u5c55.<\/p>\n<h3><a name=\"entity-hibspec-entity\"><\/a>2.4.1.\u00a0\u5b9e\u4f53<\/h3>\n<p>\u4f60\u53ef\u4ee5\u5728EJB3\u89c4\u8303\u6240\u80fd\u63d0\u4f9b\u7684\u80fd\u529b\u4e4b\u5916,\u5c31Hibernate\u5bf9\u5b9e\u4f53\u6240\u505a\u7684\u4e00\u4e9b\u64cd\u4f5c\u8fdb\u884c\u4f18\u5316.<\/p>\n<p><tt>@org.hibernate.annotations.Entity<\/tt>\u00a0\u8ffd\u52a0\u4e86\u53ef\u80fd\u9700\u8981\u7684\u989d\u5916\u7684\u5143\u6570\u636e, \u800c\u8fd9\u4e9b\u5143\u6570\u636e\u8d85\u51fa\u4e86\u6807\u51c6<tt>@Entity<\/tt>\u00a0\u4e2d\u6240\u5b9a\u4e49\u7684\u5143\u6570\u636e.<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>mutable: \u6b64\u5b9e\u4f53\u662f\u5426\u4e3a\u53ef\u53d8\u7684<\/li>\n<li>dynamicInsert: \u7528\u52a8\u6001SQL\u65b0\u589e<\/li>\n<li>dynamicUpdate: \u7528\u52a8\u6001SQL\u66f4\u65b0<\/li>\n<li>selectBeforeUpdate: \u6307\u660eHibernate\u4ece\u4e0d\u8fd0\u884cSQL UPDATE\u9664\u975e\u80fd\u786e\u5b9a\u5bf9\u8c61\u7684\u786e\u5df2\u88ab\u4fee\u6539<\/li>\n<li>polymorphism: (\u6307\u51fa)\u5b9e\u4f53\u591a\u6001\u662fPolymorphismType.IMPLICIT(\u9ed8\u8ba4)\u8fd8\u662fPolymorphismType.EXPLICIT<\/li>\n<li>persister:\u5141\u8bb8\u5bf9\u9ed8\u8ba4\u6301\u4e45\u5b9e\u73b0(persister implementation)\u7684\u8986\u76d6<\/li>\n<li>optimisticLock: \u4e50\u89c2\u9501\u7b56\u7565(OptimisticLockType.VERSION, OptimisticLockType.NONE, OptimisticLockType.DIRTY\u6216OptimisticLockType.ALL)<\/li>\n<\/ul>\n<h3>\u6ce8\u610f<\/h3>\n<p>@javax.persistence.Entity\u4ecd\u662f\u5fc5\u9009\u7684(mandatory), @org.hibernate.annotations.Entity\u4e0d\u662f\u53d6\u4ee3\u54c1.<\/p>\n<p>\u4ee5\u4e0b\u662f\u4e00\u4e9b\u9644\u52a0\u7684Hibernate\u6ce8\u89e3\u6269\u5c55\uff1a<\/p>\n<p><tt>@org.hibernate.annotations.BatchSize<\/tt>\u00a0\u5141\u8bb8\u4f60\u5b9a\u4e49\u6279\u91cf\u83b7\u53d6\u8be5\u5b9e\u4f53\u7684\u5b9e\u4f8b\u6570\u91cf(\u5982\uff1a<tt>@BatchSize(size=4)<\/tt>). \u5f53\u52a0\u8f7d\u4e00\u7279\u5b9a\u7684\u5b9e\u4f53\u65f6,Hibernate\u5c06\u52a0\u8f7d\u5728\u6301\u4e45\u4e0a\u4e0b\u6587\u4e2d\u672a\u7ecf\u521d\u59cb\u5316\u7684\u540c\u7c7b\u578b\u5b9e\u4f53,\u76f4\u81f3\u6279\u91cf\u6570\u91cf(\u4e0a\u9650).<\/p>\n<p><tt>@org.hibernate.annotations.Proxy<\/tt>\u00a0\u5b9a\u4e49\u4e86\u5b9e\u4f53\u7684\u5ef6\u8fdf\u5c5e\u6027.Lazy(\u9ed8\u8ba4\u4e3atrue)\u5b9a\u4e49\u4e86\u7c7b\u662f\u5426\u4e3a\u5ef6\u8fdf(\u52a0\u8f7d). proxyClassName\u662f\u7528\u6765\u751f\u6210\u4ee3\u7406\u7684\u63a5\u53e3(\u9ed8\u8ba4\u4e3a\u8be5\u7c7b\u672c\u8eab).<\/p>\n<p><tt>@org.hibernate.annotations.Where<\/tt>\u00a0\u5b9a\u4e49\u4e86\u5f53\u83b7\u53d6\u7c7b\u5b9e\u4f8b\u65f6\u6240\u7528\u7684SQL WHERE\u5b50\u53e5(\u8be5SQL WHERE\u5b50\u53e5\u4e3a\u53ef\u9009).<\/p>\n<p><tt>@org.hibernate.annotations.Check<\/tt>\u00a0\u5b9a\u4e49\u4e86\u5728DDL\u8bed\u53e5\u4e2d\u5b9a\u4e49\u7684\u5408\u6cd5\u6027\u68c0\u67e5\u7ea6\u675f(\u8be5\u7ea6\u675f\u4e3a\u53ef\u9009).<\/p>\n<p><tt>@OnDelete(action=OnDeleteAction.CASCADE)<\/tt>\u00a0\u5b9a\u4e49\u4e8e\u88ab\u8fde\u63a5\u7684\u5b50\u7c7b(joined subclass)\uff1a\u5728\u5220\u9664\u65f6\u4f7f\u7528SQL\u7ea7\u8fde\u5220\u9664,\u800c\u975e\u901a\u5e38\u7684Hibernate\u5220\u9664\u673a\u5236.<\/p>\n<p><tt>@Table(name=\"tableName\", indexes = { @Index(name=\"index1\", columnNames={\"column1\", \"column2\"} ) } )<\/tt>\u00a0\u5728<tt>tableName<\/tt>\u8868\u7684\u5217\u4e0a\u521b\u5efa\u5b9a\u4e49\u597d\u7684\u7d22\u5f15. \u8be5\u6ce8\u89e3\u53ef\u4ee5\u88ab\u5e94\u7528\u4e8e\u5173\u952e\u8868\u6216\u8005\u662f\u5176\u4ed6\u6b21\u8981\u7684\u8868.\u00a0<tt>@Tables<\/tt>\u00a0\u6ce8\u89e3\u5141\u8bb8\u4f60\u5728\u4e0d\u540c\u7684\u8868\u4e0a\u5e94\u7528\u7d22\u5f15. \u6b64\u6ce8\u89e3\u9884\u671f\u5728\u4f7f\u7528\u00a0<tt>@javax.persistence.Table<\/tt>\u6216\u00a0<tt>@javax.persistence.SecondaryTable<\/tt>\u7684\u5730\u65b9\u4e2d\u51fa\u73b0.<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p><tt>@org.hibernate.annotations.Table<\/tt>\u00a0\u662f\u5bf9\u00a0<tt>@javax.persistence.Table<\/tt>\u7684\u8865\u5145\u800c\u4e0d\u662f\u5b83\u7684\u66ff\u4ee3\u54c1. \u7279\u522b\u662f\u5f53\u4f60\u6253\u7b97\u6539\u53d8\u8868\u540d\u7684\u9ed8\u8ba4\u503c\u7684\u65f6\u5019\uff0c\u4f60\u5fc5\u987b\u4f7f\u7528<tt>@javax.persistence.Table<\/tt>, \u800c\u4e0d\u662f<tt>@org.hibernate.annotations.Table<\/tt>.<\/p>\n<pre>@Entity\u00a0@BatchSize(size=5)\u00a0@org.hibernate.annotations.Entity(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0selectBeforeUpdate\u00a0=\u00a0true,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dynamicInsert\u00a0=\u00a0true,\u00a0dynamicUpdate\u00a0=\u00a0true,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0optimisticLock\u00a0=\u00a0OptimisticLockType.ALL,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0polymorphism\u00a0=\u00a0PolymorphismType.EXPLICIT)\u00a0@Where(clause=\"1=1\")\u00a0@org.hibernate.annotations.Table(name=\"Forest\",\u00a0indexes\u00a0=\u00a0{\u00a0@Index(name=\"idx\",\u00a0columnNames\u00a0=\u00a0{\u00a0\"name\",\u00a0\"length\"\u00a0}\u00a0)\u00a0}\u00a0)\u00a0public\u00a0class\u00a0Forest\u00a0{\u00a0...\u00a0}<\/pre>\n<pre>@Entity\u00a0@Inheritance(\u00a0\u00a0\u00a0\u00a0\u00a0strategy=InheritanceType.JOINED\u00a0)\u00a0public\u00a0class\u00a0Vegetable\u00a0{\u00a0...\u00a0}\u00a0@Entity\u00a0@OnDelete(action=OnDeleteAction.CASCADE)\u00a0public\u00a0class\u00a0Carrot\u00a0extends\u00a0Vegetable\u00a0{\u00a0...\u00a0}<\/pre>\n<h3><a name=\"d0e2195\"><\/a>2.4.2.\u00a0\u6807\u8bc6\u7b26<\/h3>\n<p><tt><tt>@org.hibernate.annotations.GenericGenerator<\/tt>\u00a0\u5141\u8bb8\u4f60\u5b9a\u4e49\u4e00\u4e2aHibernate\u7279\u5b9a\u7684id\u751f\u6210\u5668.<\/tt><\/p>\n<pre>@Id\u00a0@GeneratedValue(generator=\"system-uuid\")\u00a0@GenericGenerator(name=\"system-uuid\",\u00a0strategy\u00a0=\u00a0\"uuid\")\u00a0public\u00a0String\u00a0getId()\u00a0{\u00a0@Id\u00a0@GeneratedValue(generator=\"hibseq\")\u00a0@GenericGenerator(name=\"hibseq\",\u00a0strategy\u00a0=\u00a0\"seqhilo\",\u00a0\u00a0\u00a0\u00a0\u00a0parameters\u00a0=\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Parameter(name=\"max_lo\",\u00a0value\u00a0=\u00a0\"5\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Parameter(name=\"sequence\",\u00a0value=\"heybabyhey\")\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0)\u00a0public\u00a0Integer\u00a0getId()\u00a0{<\/pre>\n<p><tt>strategy<\/tt>\u53ef\u4ee5\u662fHibernate3\u751f\u6210\u5668\u7b56\u7565\u7684\u7b80\u79f0, \u6216\u8005\u662f\u4e00\u4e2a<tt>IdentifierGenerator<\/tt>\u5b9e\u73b0\u7684(\u5e26\u5305\u8def\u5f84\u7684)\u5168\u9650\u5b9a\u7c7b\u540d. \u4f60\u53ef\u4ee5\u901a\u8fc7<tt>parameters<\/tt>\u5c5e\u6027\u589e\u52a0\u4e00\u4e9b\u53c2\u6570.<\/p>\n<h3><a name=\"entity-hibspec-property\"><\/a>2.4.3.\u00a0\u5c5e\u6027<\/h3>\n<h4><a name=\"d0e2219\"><\/a>2.4.3.1.\u00a0\u8bbf\u95ee\u7c7b\u578b<\/h4>\n<p>\u8bbf\u95ee\u7c7b\u578b\u662f\u6839\u636e<tt>@Id<\/tt>\u6216<tt>@EmbeddedId<\/tt>\u00a0\u5728\u5b9e\u4f53\u7ee7\u627f\u5c42\u6b21\u4e2d\u6240\u5904\u7684\u4f4d\u7f6e\u63a8\u6f14\u800c\u5f97\u7684.\u5b50\u5b9e\u4f53(Sub-entities), \u5185\u5d4c\u5bf9\u8c61\u548c\u88ab\u6620\u5c04\u7684\u7236\u7c7b\u5747\u7ee7\u627f\u4e86\u6839\u5b9e\u4f53(root entity)\u7684\u8bbf\u95ee\u7c7b\u578b.<\/p>\n<p>\u5728Hibernate\u4e2d,\u4f60\u53ef\u4ee5\u628a\u8bbf\u95ee\u7c7b\u578b\u8986\u76d6\u6210\uff1a<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u4f7f\u7528\u5b9a\u5236\u7684\u8bbf\u95ee\u7c7b\u578b\u7b56\u7565<\/li>\n<li>\u4f18\u5316\u7c7b\u7ea7\u6216\u5c5e\u6027\u7ea7\u7684\u8bbf\u95ee\u7c7b\u578b<\/li>\n<\/ul>\n<p>\u4e3a\u652f\u6301\u8fd9\u79cd\u884c\u4e3a,Hibernate\u5f15\u5165\u4e86@AccessType\u6ce8\u89e3.\u4f60\u53ef\u4ee5\u5bf9\u4ee5\u4e0b\u5143\u7d20\u5b9a\u4e49\u8bbf\u95ee\u7c7b\u578b\uff1a<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u5b9e\u4f53<\/li>\n<li>\u7236\u7c7b<\/li>\n<li>\u53ef\u5185\u5d4c\u7684\u5bf9\u8c61<\/li>\n<li>\u5c5e\u6027<\/li>\n<\/ul>\n<p>\u88ab\u6ce8\u89e3\u5143\u7d20\u7684\u8bbf\u95ee\u7c7b\u578b\u4f1a\u88ab\u8986\u76d6,\u82e5\u8986\u76d6\u662f\u5728\u7c7b\u4e00\u7ea7\u4e0a,\u5219\u6240\u6709\u7684\u5c5e\u6027\u7ee7\u627f\u8bbf\u95ee\u7c7b\u578b. \u5bf9\u4e8e\u6839\u5b9e\u4f53,\u5176\u8bbf\u95ee\u7c7b\u578b\u4f1a\u88ab\u8ba4\u4e3a\u662f\u6574\u4e2a\u7ee7\u627f\u5c42\u6b21\u4e2d\u7684\u7f3a\u7701\u8bbe\u7f6e(\u53ef\u5728\u7c7b\u6216\u5c5e\u6027\u4e00\u7ea7\u8986\u76d6).<\/p>\n<p>\u82e5\u8bbf\u95ee\u7c7b\u578b\u88ab\u6807\u4ee5&#8221;property&#8221;,\u5219Hibernate\u4f1a\u626b\u63cfgetter\u65b9\u6cd5\u7684\u6ce8\u89e3,\u82e5\u8bbf\u95ee\u7c7b\u578b\u88ab\u6807\u4ee5&#8221;field&#8221;, \u5219\u626b\u63cf\u5b57\u6bb5\u7684\u6ce8\u89e3.\u5426\u5219,\u626b\u63cf\u6807\u4e3a@Id\u6216@embeddedId\u7684\u5143\u7d20.<\/p>\n<p>\u4f60\u53ef\u4ee5\u8986\u76d6\u67d0\u4e2a\u5c5e\u6027(property)\u7684\u8bbf\u95ee\u7c7b\u578b,\u4f46\u662f\u53d7\u6ce8\u89e3\u7684\u5143\u7d20\u5c06\u4e0d\u53d7\u5f71\u54cd\uff1a \u4f8b\u5982\u4e00\u4e2a\u5177\u6709field\u8bbf\u95ee\u7c7b\u578b\u7684\u5b9e\u4f53,(\u6211\u4eec)\u53ef\u4ee5\u5c06\u67d0\u4e2a\u5b57\u6bb5\u6807\u6ce8\u4e3a @AccessType(&#8220;property&#8221;), \u5219\u8be5\u5b57\u6bb5\u7684\u8bbf\u95ee\u7c7b\u578b\u968f\u4e4b\u5c06\u6210\u4e3aproperty,\u4f46\u662f\u5176\u4ed6\u5b57\u6bb5\u4e0a\u4f9d\u7136\u9700\u8981\u643a\u5e26\u6ce8\u89e3.<\/p>\n<p>\u82e5\u7236\u7c7b\u6216\u53ef\u5185\u5d4c\u7684\u5bf9\u8c61\u6ca1\u6709\u88ab\u6ce8\u89e3,\u5219\u4f7f\u7528\u6839\u5b9e\u4f53\u7684\u8bbf\u95ee\u7c7b\u578b(\u5373\u4f7f\u5df2\u7ecf\u5728\u975e\u76f4\u7cfb\u7236\u7c7b\u6216\u53ef\u5185\u5d4c\u5bf9\u8c61\u4e0a\u5b9a\u4e49\u4e86\u8bbf\u95ee\u7c7b\u578b). \u6b64\u65f6\u4fc4\u7f57\u65af\u5957\u5a03(Russian doll)\u539f\u7406\u5c31\u4e0d\u518d\u9002\u7528.(\u8bd1\u6ce8\uff1a\u4fc4\u7f57\u65af\u5957\u5a03(\u043c\u0430\u0442\u0440\u0451\u0448\u043a\u0430\u6216 \u043c\u0430\u0442\u0440\u0435\u0448\u043a\u0430)\u662f\u4fc4\u7f57\u65af\u7279\u4ea7\u6728\u5236\u73a9\u5177, \u4e00\u822c\u7531\u591a\u4e2a\u4e00\u6837\u56fe\u6848\u7684\u7a7a\u5fc3\u6728\u5a03\u5a03\u4e00\u4e2a\u5957\u4e00\u4e2a\u7ec4\u6210,\u6700\u591a\u53ef\u8fbe\u5341\u591a\u4e2a,\u901a\u5e38\u4e3a\u5706\u67f1\u5f62,\u5e95\u90e8\u5e73\u5766\u53ef\u4ee5\u76f4\u7acb.)<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Person\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0@GeneratedValue\u00a0\/\/access\u00a0type\u00a0field\u00a0\u00a0\u00a0\u00a0\u00a0Integer\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0@Embedded\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverrides({\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverride(name\u00a0=\u00a0\"iso2\",\u00a0column\u00a0=\u00a0@Column(name\u00a0=\u00a0\"bornIso2\")),\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverride(name\u00a0=\u00a0\"name\",\u00a0column\u00a0=\u00a0@Column(name\u00a0=\u00a0\"bornCountryName\"))\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\u00a0\u00a0\u00a0\u00a0\u00a0Country\u00a0bornIn;\u00a0}\u00a0@Embeddable\u00a0@AccessType(\"property\")\u00a0\/\/override\u00a0access\u00a0type\u00a0for\u00a0all\u00a0properties\u00a0in\u00a0Country\u00a0public\u00a0class\u00a0Country\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0iso2;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getIso2()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0iso2;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setIso2(String\u00a0iso2)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.iso2\u00a0=\u00a0iso2;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@Column(name\u00a0=\u00a0\"countryName\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getName()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setName(String\u00a0name)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.name\u00a0=\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<h4><a name=\"d0e2267\"><\/a>2.4.3.2.\u00a0\u516c\u5f0f<\/h4>\n<p>\u6709\u65f6\u5019,\u4f60\u60f3\u8ba9\u6570\u636e\u5e93,\u800c\u975eJVM,\u6765\u66ff\u4f60\u5b8c\u6210\u4e00\u4e9b\u8ba1\u7b97,\u4e5f\u53ef\u80fd\u60f3\u521b\u5efa\u67d0\u79cd\u865a\u62df\u5217. \u4f60\u53ef\u4ee5\u4f7f\u7528SQL\u7247\u6bb5(\u4ea6\u79f0\u4e3a\u516c\u5f0f),\u800c\u4e0d\u662f\u5c06\u5c5e\u6027\u6620\u5c04\u5230(\u7269\u7406)\u5217. \u8fd9\u79cd\u5c5e\u6027\u662f\u53ea\u8bfb\u7684(\u5c5e\u6027\u503c\u7531\u516c\u6c42\u5f97).<\/p>\n<pre>@Formula(\"obj_length\u00a0*\u00a0obj_height\u00a0*\u00a0obj_width\")\u00a0public\u00a0long\u00a0getObjectVolume()<\/pre>\n<p>SQL\u7247\u6bb5\u53ef\u4ee5\u662f\u4efb\u610f\u590d\u6742\u7684,\u751a\u81f3\u53ef\u5305\u542b\u5b50\u67e5\u8be2.<\/p>\n<h4><a name=\"d0e2276\"><\/a>2.4.3.3.\u00a0\u7c7b\u578b<\/h4>\n<p><tt>@org.hibernate.annotations.Type<\/tt>\u00a0\u8986\u76d6\u4e86Hibernate\u6240\u7528\u7684\u9ed8\u8ba4\u7c7b\u578b\uff1a\u8fd9\u901a\u5e38\u4e0d\u662f\u5fc5\u987b\u7684,\u56e0\u4e3a\u7c7b\u578b\u53ef\u4ee5\u7531Hibernate\u6b63\u786e\u63a8\u5f97. \u5173\u4e8eHibernate\u7c7b\u578b\u7684\u8be6\u7ec6\u4fe1\u606f,\u8bf7\u53c2\u8003Hibernate\u4f7f\u7528\u624b\u518c.<\/p>\n<p><tt>@org.hibernate.annotations.TypeDef<\/tt>\u00a0\u548c\u00a0<tt>@org.hibernate.annotations.TypeDefs<\/tt>\u5141\u8bb8\u4f60\u6765\u58f0\u660e\u7c7b\u578b\u5b9a\u4e49. \u8fd9\u4e9b\u6ce8\u89e3\u88ab\u7f6e\u4e8e\u7c7b\u6216\u5305\u4e00\u7ea7.\u6ce8\u610f,\u5bf9session factory\u6765\u8bf4, \u8fd9\u4e9b\u5b9a\u4e49\u5c06\u662f\u5168\u5c40\u7684(\u5373\u4f7f\u5b9a\u4e49\u4e8e\u7c7b\u4e00\u7ea7),\u5e76\u4e14\u7c7b\u578b\u5b9a\u4e49\u5fc5\u987b\u5148\u4e8e\u4efb\u4f55\u4f7f\u7528.<\/p>\n<pre>@TypeDefs(\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@TypeDef(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"caster\",\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0typeClass\u00a0=\u00a0CasterStringType.class,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parameters\u00a0=\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Parameter(name=\"cast\",\u00a0value=\"lower\")\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0)\u00a0package\u00a0org.hibernate.test.annotations.entity;\u00a0...\u00a0public\u00a0class\u00a0Forest\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Type(type=\"caster\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getSmallText()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u5f53\u4f7f\u7528\u7ec4\u5408\u7684\u7528\u6237\u81ea\u5b9a\u4e49\u7c7b\u578b\u65f6,\u4f60\u5fc5\u987b\u81ea\u5df1\u8868\u793a\u5217\u7684\u5b9a\u4e49.\u00a0<tt>@Columns<\/tt>\u5c31\u662f\u4e3a\u4e86\u6b64\u76ee\u7684\u800c\u5f15\u5165\u7684.<\/p>\n<pre>@Type(type=\"org.hibernate.test.annotations.entity.MonetaryAmountUserType\")\u00a0@Columns(columns\u00a0=\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Column(name=\"r_amount\"),\u00a0\u00a0\u00a0\u00a0\u00a0@Column(name=\"r_currency\")\u00a0})\u00a0public\u00a0MonetaryAmount\u00a0getAmount()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0amount;\u00a0}\u00a0public\u00a0class\u00a0MonetaryAmount\u00a0implements\u00a0Serializable\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0BigDecimal\u00a0amount;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Currency\u00a0currency;\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<h4><a name=\"d0e2299\"><\/a>2.4.3.4.\u00a0\u7d22\u5f15<\/h4>\n<p>\u901a\u8fc7\u5728\u5217\u5c5e\u6027(property)\u4e0a\u4f7f\u7528<tt>@Index<\/tt>\u6ce8\u89e3, \u53ef\u4ee5\u5728\u7279\u5b9a\u5217\u4e0a\u5b9a\u4e49\u7d22\u5f15,columnNames\u5c5e\u6027(attribute)\u5c06\u968f\u4e4b\u88ab\u5ffd\u7565.<\/p>\n<pre>@Column(secondaryTable=\"Cat1\")\u00a0@Index(name=\"story1index\")\u00a0public\u00a0String\u00a0getStoryPart1()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0storyPart1;\u00a0}<\/pre>\n<h4><a name=\"d0e2309\"><\/a>2.4.3.5.\u00a0@Parent<\/h4>\n<p>\u5728\u5d4c\u5165\u5f0f\u5bf9\u8c61\u5185\u90e8,\u4f60\u53ef\u4ee5\u5728\u90a3\u4e9b\u6307\u5411\u8be5\u5d4c\u5165\u5f0f\u5bf9\u8c61\u6240\u5c5e\u5143\u7d20\u7684\u5c5e\u6027\u4e0a\u5b9a\u4e49\u8be5\u6ce8\u89e3.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Person\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Embeddable\u00a0public\u00a0Address\u00a0address;\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0@Embeddable\u00a0public\u00a0class\u00a0Address\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Parent\u00a0public\u00a0Person\u00a0owner;\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0person\u00a0==\u00a0person.address.owner<\/pre>\n<h4><a name=\"d0e2316\"><\/a>2.4.3.6.\u00a0\u751f\u6210\u7684\u5c5e\u6027<\/h4>\n<p>\u67d0\u4e9b\u5c5e\u6027\u53ef\u4ee5\u5728\u5bf9\u6570\u636e\u5e93\u505a\u63d2\u5165\u6216\u66f4\u65b0\u64cd\u4f5c\u7684\u65f6\u5019\u751f\u6210. Hibernate\u80fd\u591f\u5904\u7406\u8fd9\u6837\u7684\u5c5e\u6027,\u5e76\u89e6\u53d1\u4e00\u4e2a\u540e\u7eed\u7684\u67e5\u8be2\u6765\u8bfb\u53d6\u8fd9\u4e9b\u5c5e\u6027.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Antenna\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0public\u00a0Integer\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0@Generated(GenerationTime.ALWAYS)\u00a0@Column(insertable\u00a0=\u00a0false,\u00a0updatable\u00a0=\u00a0false)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0longitude;\u00a0\u00a0\u00a0\u00a0\u00a0@Generated(GenerationTime.INSERT)\u00a0@Column(insertable\u00a0=\u00a0false)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0latitude;\u00a0}<\/pre>\n<p>\u4f60\u53ef\u4ee5\u5c06\u5c5e\u6027\u6ce8\u89e3\u4e3a<tt>@Generated<\/tt>. \u4f46\u662f\u4f60\u8981\u6ce8\u610finsertability\u548cupdatability\u4e0d\u8981\u548c\u4f60\u9009\u62e9\u7684\u751f\u6210\u7b56\u7565\u51b2\u7a81. \u5982\u679c\u9009\u62e9\u4e86GenerationTime.INSERT,\u8be5\u5c5e\u6027\u4e0d\u80fd\u5305\u542binsertable\u5217, \u5982\u679c\u9009\u62e9\u4e86GenerationTime.ALWAYS,\u8be5\u5c5e\u6027\u4e0d\u80fd\u5305\u542binsertable\u548cupdatable\u5217.<\/p>\n<p><tt>@Version<\/tt>\u5c5e\u6027\u4e0d\u53ef\u4ee5\u4e3a\u00a0<tt>@Generated(INSERT)<\/tt>(\u8bbe\u8ba1\u65f6), \u53ea\u80fd\u662f\u00a0<tt>NEVER<\/tt>\u6216<tt>ALWAYS<\/tt>.<\/p>\n<h3><a name=\"d0e2341\"><\/a>2.4.4.\u00a0\u7ee7\u627f<\/h3>\n<p>SINGLE_TABLE \u662f\u4e2a\u529f\u80fd\u5f3a\u5927\u7684\u7b56\u7565,\u4f46\u6709\u65f6,\u7279\u522b\u5bf9\u9057\u7559\u7cfb\u7edf\u800c\u8a00, \u662f\u65e0\u6cd5\u52a0\u5165\u4e00\u4e2a\u989d\u5916\u7684\u8fa8\u522b\u7b26\u5217. \u7531\u6b64,Hibernate\u5f15\u5165\u4e86\u8fa8\u522b\u7b26\u516c\u5f0f(discriminator formula)\u7684\u6982\u5ff5\uff1a\u00a0<tt>@DiscriminatorFormula<\/tt>\u662f<tt>@DiscriminatorColumn<\/tt>\u7684\u66ff\u4ee3\u54c1, \u5b83\u4f7f\u7528SQL\u7247\u6bb5\u4f5c\u4e3a\u8fa8\u522b\u7b26\u89e3\u51b3\u65b9\u6848\u7684\u516c\u5f0f( \u4e0d\u9700\u8981\u6709\u4e00\u4e2a\u4e13\u95e8\u7684\u5b57\u6bb5).<\/p>\n<pre>@Entity\u00a0@DiscriminatorForumla(\"case\u00a0when\u00a0forest_type\u00a0is\u00a0null\u00a0then\u00a00\u00a0else\u00a0forest_type\u00a0end\")\u00a0public\u00a0class\u00a0Forest\u00a0{\u00a0...\u00a0}<\/pre>\n<h3><a name=\"d0e2354\"><\/a>2.4.5.\u00a0\u5173\u4e8e\u5355\u4e2a\u5173\u8054\u5173\u7cfb\u7684\u6ce8\u89e3<\/h3>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b,\u5f53\u9884\u671f\u7684\u88ab\u5173\u8054\u5143\u7d20\u4e0d\u5728\u6570\u636e\u5e93\u4e2d(\u5173\u4e4e\u5173\u8054\u5217\u7684\u9519\u8befid),\u81f4\u4f7fHiberante\u65e0\u6cd5\u89e3\u51b3\u5173\u8054\u6027\u95ee\u9898\u65f6,Hibernate\u5c31\u4f1a\u629b\u51fa\u5f02\u5e38. \u8fd9\u5bf9\u9057\u7559schema\u548c\u5386\u7ecf\u62d9\u52a3\u7ef4\u62a4\u7684schema\u800c\u8a00,\u8fd9\u6216\u6709\u8bb8\u591a\u4e0d\u4fbf. \u6b64\u65f6,\u4f60\u53ef\u7528\u00a0<tt>@NotFound\u00a0<\/tt>\u6ce8\u89e3\u8ba9Hibernate\u7565\u8fc7\u8fd9\u6837\u7684\u5143\u7d20\u800c\u4e0d\u662f\u629b\u51fa\u5f02\u5e38. \u8be5\u6ce8\u89e3\u53ef\u7528\u4e8e\u00a0<tt>@OneToOne\u00a0<\/tt>(\u6709\u5916\u952e)\u3001\u00a0<tt>@ManyToOne\u00a0<\/tt>\u3001\u00a0<tt>@OneToMany\u00a0<\/tt>\u6216\u00a0<tt>@ManyToMany\u00a0<\/tt>\u5173\u8054.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Child\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0@NotFound(action=NotFoundAction.IGNORE)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Parent\u00a0getParent()\u00a0{\u00a0...\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u6709\u65f6\u5019\u5220\u9664\u67d0\u5b9e\u4f53\u7684\u65f6\u5019\u9700\u8981\u89e6\u53d1\u6570\u636e\u5e93\u7684\u7ea7\u8054\u5220\u9664.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Child\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0@ManyToOne\u00a0\u00a0\u00a0\u00a0\u00a0@OnDelete(action=OnDeleteAction.CASCADE)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Parent\u00a0getParent()\u00a0{\u00a0...\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u4e0a\u9762\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,Hibernate\u5c06\u751f\u6210\u4e00\u4e2a\u6570\u636e\u5e93\u7ea7\u7684\u7ea7\u8054\u5220\u9664\u7ea6\u675f.<\/p>\n<h4><a name=\"d0e2382\"><\/a>2.4.5.1.\u00a0\u5ef6\u8fdf\u9009\u9879\u548c\u83b7\u53d6\u6a21\u5f0f<\/h4>\n<p>EJB3\u4e3a\u5ef6\u8fdf\u52a0\u8f7d\u548c\u83b7\u53d6\u6a21\u5f0f\u63d0\u4f9b\u4e86<tt>fetch<\/tt>\u9009\u9879,\u800cHibernate \u8fd9\u65b9\u9762\u63d0\u4f9b\u4e86\u66f4\u4e30\u5bcc\u7684\u9009\u9879\u96c6.\u4e3a\u4e86\u66f4\u597d\u7684\u8c03\u6574\u5ef6\u8fdf\u52a0\u8f7d\u548c\u83b7\u53d6\u7b56\u7565,Hibernate\u5f15\u5165\u4e86 \u4e00\u4e9b\u9644\u52a0\u7684\u6ce8\u89e3:<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li><tt>@LazyToOne<\/tt>: \u5b9a\u4e49\u4e86\u00a0<tt>@ManyToOne<\/tt>\u00a0\u548c\u00a0<tt>@OneToOne<\/tt>\u00a0\u5173\u8054\u7684\u5ef6\u8fdf\u9009\u9879.\u00a0<tt>LazyToOneOption<\/tt>\u00a0\u53ef\u4ee5\u662f\u00a0<tt>PROXY<\/tt>\u00a0(\u4f8b\u5982:\u57fa\u4e8e\u4ee3\u7406\u7684\u5ef6\u8fdf\u52a0\u8f7d),\u00a0<tt>NO_PROXY<\/tt>\u00a0(\u4f8b\u5982:\u57fa\u4e8e\u5b57\u8282\u7801\u589e\u5f3a\u7684\u5ef6\u8fdf\u52a0\u8f7d &#8211; \u6ce8\u610f\u9700\u8981\u5728\u6784\u5efa\u671f\u5904\u7406\u5b57\u8282\u7801) \u548c\u00a0<tt>FALSE<\/tt>\u00a0(\u975e\u5ef6\u8fdf\u52a0\u8f7d\u7684\u5173\u8054)<\/li>\n<li><tt>@LazyCollection<\/tt>: \u5b9a\u4e49\u4e86\u00a0<tt>@ManyToMany<\/tt>\u548c\u00a0<tt>@OneToMany<\/tt>\u00a0\u5173\u8054\u7684\u5ef6\u8fdf\u9009\u9879. LazyCollectionOption \u53ef\u4ee5\u662f<tt>TRUE<\/tt>\u00a0(\u96c6\u5408\u5177\u6709\u5ef6\u8fdf\u6027,\u53ea\u6709\u5728\u8bbf\u95ee\u7684\u65f6\u5019\u624d\u52a0\u8f7d),\u00a0<tt>EXTRA<\/tt>\u00a0(\u96c6\u5408\u5177\u6709\u5ef6\u8fdf\u6027,\u5e76\u4e14\u6240\u6709\u7684\u64cd\u4f5c\u90fd\u4f1a\u5c3d\u91cf\u907f\u514d\u52a0\u8f7d\u96c6\u5408, \u5bf9\u4e8e\u4e00\u4e2a\u5de8\u5927\u7684\u96c6\u5408\u7279\u522b\u6709\u7528,\u56e0\u4e3a\u8fd9\u6837\u7684\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u6ca1\u6709\u5fc5\u8981\u5168\u90e8\u52a0\u8f7d)\u548c FALSE (\u975e\u5ef6\u8fdf\u52a0\u8f7d\u7684\u5173\u8054)<\/li>\n<li><tt>@Fetch<\/tt>: \u5b9a\u4e49\u4e86\u52a0\u8f7d\u5173\u8054\u5173\u7cfb\u7684\u83b7\u53d6\u7b56\u7565.\u00a0<tt>FetchMode<\/tt>\u00a0\u53ef\u4ee5\u662f\u00a0<tt>SELECT<\/tt>\u00a0(\u5728\u9700\u8981\u52a0\u8f7d\u5173\u8054\u7684\u65f6\u5019\u89e6\u53d1select\u64cd\u4f5c),\u00a0<tt>SUBSELECT<\/tt>\u00a0(\u53ea\u5bf9\u96c6\u5408\u6709\u6548,\u4f7f\u7528\u4e86\u5b50\u67e5\u8be2\u7b56\u7565,\u8be6\u60c5\u53c2\u8003Hibernate\u53c2\u8003\u6587\u6863) or\u00a0<tt>JOIN<\/tt>\u00a0(\u5728\u52a0\u8f7d\u4e3b\u5b9e\u4f53(owner entity)\u7684\u65f6\u5019\u4f7f\u7528SQL JOIN\u6765\u52a0\u8f7d\u5173\u8054\u5173\u7cfb).\u00a0<tt>JOIN<\/tt>\u00a0\u5c06\u8986\u5199\u4efb\u4f55\u5ef6\u8fdf\u5c5e\u6027 (\u901a\u8fc7<tt>JOIN<\/tt>\u7b56\u7565\u52a0\u8f7d\u7684\u5173\u8054\u5c06\u4e0d\u518d\u5177\u6709\u5ef6\u8fdf\u6027).<\/li>\n<\/ul>\n<p>The Hibernate annotations overrides the EJB3 fetching options.<\/p>\n<p>Hibernate\u6ce8\u89e3\u8986\u5199\u4e86EJB3\u63d0\u4f9b\u7684\u83b7\u53d6(fetch)\u9009\u9879.<\/p>\n<p><a name=\"d0e2458\"><\/a><\/p>\n<p><strong>\u8868\u00a02.3.\u00a0\u5ef6\u8fdf\u548c\u83b7\u53d6\u9009\u9879\u7684\u7b49\u6548\u6ce8\u89e3<\/strong><\/p>\n<table summary=\"\u5ef6\u8fdf\u548c\u83b7\u53d6\u9009\u9879\u7684\u7b49\u6548\u6ce8\u89e3\">\n<colgroup>\n<col \/>\n<col \/>\n<col \/><\/colgroup>\n<thead>\n<tr class=\"firstRow\">\n<th>Annotations<\/th>\n<th>Lazy<\/th>\n<th>Fetch<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>@[One|Many]ToOne](fetch=FetchType.LAZY)<\/td>\n<td>@LazyToOne(PROXY)<\/td>\n<td>@Fetch(SELECT)<\/td>\n<\/tr>\n<tr>\n<td>@[One|Many]ToOne](fetch=FetchType.EAGER)<\/td>\n<td>@LazyToOne(FALSE)<\/td>\n<td>@Fetch(JOIN)<\/td>\n<\/tr>\n<tr>\n<td>@ManyTo[One|Many](fetch=FetchType.LAZY)<\/td>\n<td>@LazyCollection(TRUE)<\/td>\n<td>@Fetch(SELECT)<\/td>\n<\/tr>\n<tr>\n<td>@ManyTo[One|Many](fetch=FetchType.EAGER)<\/td>\n<td>@LazyCollection(FALSE)<\/td>\n<td>@Fetch(JOIN)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><a name=\"entity-hibspec-collection\"><\/a>2.4.6.\u00a0\u5173\u4e8e\u96c6\u5408\u7c7b\u578b\u7684\u6ce8\u89e3<\/h3>\n<h4><a name=\"d0e2502\"><\/a>2.4.6.1.\u00a0\u53c2\u6570\u6ce8\u89e3<\/h4>\n<p>\u4ee5\u4e0b\u662f\u53ef\u80fd\u7684\u8bbe\u7f6e\u65b9\u5f0f<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>\u7528@BatchSizebatch\u8bbe\u7f6e\u96c6\u5408\u7684batch\u5927\u5c0f<\/li>\n<li>\u7528@Where\u6ce8\u89e3\u8bbe\u7f6eWhere\u5b50\u53e5<\/li>\n<li>\u7528\u6ce8\u89e3@Check\u6765\u8bbe\u7f6echeck\u5b50\u53e5<\/li>\n<li>\u7528\u6ce8\u89e3@OrderBy\u6765\u8bbe\u7f6eSQL\u7684order by\u5b50\u53e5<\/li>\n<li>\u5229\u7528@OnDelete(action=OnDeleteAction.CASCADE) \u6ce8\u89e3\u8bbe\u7f6e\u7ea7\u8fde\u5220\u9664\u7b56\u7565<\/li>\n<\/ul>\n<p>\u4f60\u4e5f\u53ef\u4ee5\u5229\u7528<tt>@Sort<\/tt>\u6ce8\u89e3\u5b9a\u4e49\u4e00\u4e2a\u6392\u5e8f\u6bd4\u8f83\u5668(sort comparator), \u8868\u660e\u5e0c\u671b\u7684\u6bd4\u8f83\u5668\u7c7b\u578b,\u65e0\u5e8f\u3001\u81ea\u7136\u987a\u5e8f\u6216\u81ea\u5b9a\u4e49\u6392\u5e8f,\u4e09\u8005\u62e9\u4e00.\u82e5\u4f60\u60f3\u7528\u4f60\u81ea\u5df1\u5b9e\u73b0\u7684comparator, \u4f60\u8fd8\u9700\u8981\u5229\u7528<tt>comparator<\/tt>\u5c5e\u6027(attribute)\u6307\u660e\u5b9e\u73b0\u7c7b.<\/p>\n<pre>\u00a0\u00a0\u00a0\u00a0@OneToMany(cascade=CascadeType.ALL,\u00a0fetch=FetchType.EAGER)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"CUST_ID\")\u00a0\u00a0\u00a0\u00a0\u00a0@Sort(type\u00a0=\u00a0SortType.COMPARATOR,\u00a0comparator\u00a0=\u00a0TicketComparator.class)\u00a0\u00a0\u00a0\u00a0\u00a0@Where(clause=\"1=1\")\u00a0\u00a0\u00a0\u00a0\u00a0@OnDelete(action=OnDeleteAction.CASCADE)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0SortedSet&lt;Ticket&gt;\u00a0getTickets()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0tickets;\u00a0\u00a0\u00a0\u00a0\u00a0}<\/pre>\n<p>\u5173\u4e8e\u8fd9\u4e9b\u6ce8\u89e3\u66f4\u8be6\u7ec6\u7684\u4fe1\u606f,\u8bf7\u53c2\u9605\u6b64\u524d\u7684\u63cf\u8ff0.<\/p>\n<h4><a name=\"d0e2530\"><\/a>2.4.6.2.\u00a0\u66f4\u591a\u7684\u96c6\u5408\u7c7b\u578b<\/h4>\n<p>\u6bd4EJB3\u66f4\u80dc\u4e00\u7b79\u7684\u662f,Hibernate Annotations\u652f\u6301\u771f\u6b63\u7684\u00a0<tt>List<\/tt>\u548c<tt>Array<\/tt>. \u6620\u5c04\u96c6\u5408\u7684\u65b9\u5f0f\u548c\u4ee5\u524d\u5b8c\u5168\u4e00\u6837,\u53ea\u4e0d\u8fc7\u8981\u65b0\u589e<tt>@IndexColumn<\/tt>\u6ce8\u89e3. \u8be5\u6ce8\u89e3\u5141\u8bb8\u4f60\u6307\u660e\u5b58\u653e\u7d22\u5f15\u503c\u7684\u5b57\u6bb5.\u4f60\u8fd8\u53ef\u4ee5\u5b9a\u4e49\u4ee3\u8868\u6570\u636e\u5e93\u4e2d\u9996\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u503c(\u4ea6\u79f0\u4e3a\u7d22\u5f15\u57fa\u6570). \u5e38\u89c1\u53d6\u503c\u4e3a<tt>0<\/tt>\u6216<tt>1<\/tt>.<\/p>\n<pre>@OneToMany(cascade\u00a0=\u00a0CascadeType.ALL)\u00a0@IndexColumn(name\u00a0=\u00a0\"drawer_position\",\u00a0base=1)\u00a0public\u00a0List&lt;Drawer&gt;\u00a0getDrawers()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0drawers;\u00a0}<\/pre>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u5047\u5982\u4f60\u5fd8\u4e86\u8bbe\u7f6e<tt>@IndexColumn<\/tt>, Hibernate\u4f1a\u91c7\u7528\u5305(bag)\u8bed\u4e49(\u8bd1\u6ce8\uff1a\u5373\u5141\u8bb8\u91cd\u590d\u5143\u7d20\u7684\u65e0\u5e8f\u96c6\u5408).<\/p>\n<p>Hibernate\u6ce8\u89e3\u652f\u6301true Map\u6620\u5c04, \u5982\u679c\u6ca1\u6709\u8bbe\u7f6e<tt>@javax.persistence.MapKey<\/tt>, hibernate\u5c06key\u5143\u7d20\u6216\u5d4c\u5165\u5f0f\u5bf9\u8c61\u76f4\u63a5\u6620\u5c04\u5230\u4ed6\u4eec\u6240\u5c5e\u7684\u5217. \u8981\u8986\u5199\u9ed8\u8ba4\u7684\u5217,\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u6ce8\u89e3:\u00a0<tt>@org.hibernate.annotations.MapKey<\/tt>\u9002\u7528\u7684key\u4e3a\u57fa\u672c\u7c7b\u578b\u6216\u8005\u5d4c\u5165\u5f0f\u5bf9\u8c61,<tt>@org.hibernate.annotations.MapKey<\/tt>\u9002\u7528\u7684key\u4e3a\u5b9e\u4f53.<\/p>\n<p>Hibernate Annotations\u8fd8\u652f\u6301\u6838\u5fc3\u7c7b\u578b\u96c6\u5408(Integer, String, Enums, &#8230;&#8230;)\u3001 \u53ef\u5185\u5d4c\u5bf9\u8c61\u7684\u96c6\u5408,\u751a\u81f3\u57fa\u672c\u7c7b\u578b\u6570\u7ec4.\u8fd9\u5c31\u662f\u6240\u8c13\u7684\u5143\u7d20\u96c6\u5408.<\/p>\n<p>\u5143\u7d20\u96c6\u5408\u53ef\u7528@CollectionOfElements\u6765\u6ce8\u89e3(\u4f5c\u4e3a@OneToMany\u7684\u66ff\u4ee3). \u4e3a\u4e86\u5b9a\u4e49\u96c6\u5408\u8868(\u8bd1\u6ce8\uff1a\u5373\u5b58\u653e\u96c6\u5408\u5143\u7d20\u7684\u8868,\u4e0e\u4e0b\u9762\u63d0\u5230\u7684\u4e3b\u8868\u5bf9\u5e94),\u8981\u5728\u5173\u8054\u5c5e\u6027\u4e0a\u4f7f\u7528@JoinTable\u6ce8\u89e3, joinColumns\u5b9a\u4e49\u4e86\u4ecb\u4e4e\u5b9e\u4f53\u4e3b\u8868\u4e0e\u96c6\u5408\u8868\u4e4b\u95f4\u7684\u8fde\u63a5\u5b57\u6bb5(inverseJoincolumn\u662f\u65e0\u6548\u7684\u4e14\u5176\u503c\u5e94\u4e3a\u7a7a). \u5bf9\u4e8e\u6838\u5fc3\u7c7b\u578b\u7684\u96c6\u5408\u6216\u57fa\u672c\u7c7b\u578b\u6570\u7ec4,\u4f60\u53ef\u4ee5\u5728\u5173\u8054\u5c5e\u6027\u4e0a\u7528<tt>@Column<\/tt>\u6765\u8986\u76d6\u5b58\u653e\u5143\u7d20\u503c\u7684\u5b57\u6bb5\u7684\u5b9a\u4e49. \u4f60\u8fd8\u53ef\u4ee5\u7528<tt>@AttributeOverride<\/tt>\u6765\u8986\u76d6\u5b58\u653e\u53ef\u5185\u5d4c\u5bf9\u8c61\u7684\u5b57\u6bb5\u7684\u5b9a\u4e49. \u8981\u8bbf\u95ee\u96c6\u5408\u5143\u7d20,\u9700\u8981\u5c06\u8be5\u6ce8\u89e3\u7684name\u5c5e\u6027\u503c\u8bbe\u7f6e\u4e3a&#8221;element&#8221;(&#8220;element&#8221;\u7528\u4e8e\u6838\u5fc3\u7c7b\u578b,\u800c&#8221;element.serial&#8221; \u7528\u4e8e\u5d4c\u5165\u5f0f\u5bf9\u8c61\u7684serial\u5c5e\u6027).\u8981\u8bbf\u95ee\u96c6\u5408\u7684index\/key,\u5219\u5c06\u8be5\u6ce8\u89e3\u7684name\u5c5e\u6027\u503c\u8bbe\u7f6e\u4e3a&#8221;key&#8221;.<\/p>\n<pre>@Entity\u00a0public\u00a0class\u00a0Boy\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Integer\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Set&lt;String&gt;\u00a0nickNames\u00a0=\u00a0new\u00a0HashSet&lt;String&gt;();\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0int[]\u00a0favoriteNumbers;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Set&lt;Toy&gt;\u00a0favoriteToys\u00a0=\u00a0new\u00a0HashSet&lt;Toy&gt;();\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0Set&lt;Character&gt;\u00a0characters\u00a0=\u00a0new\u00a0HashSet&lt;Character&gt;();\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0@GeneratedValue\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Integer\u00a0getId()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@CollectionOfElements\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;String&gt;\u00a0getNickNames()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0nickNames;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@CollectionOfElements\u00a0\u00a0\u00a0\u00a0\u00a0@JoinTable(\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0table=@Table(name=\"BoyFavoriteNumbers\"),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0joinColumns\u00a0=\u00a0@JoinColumn(name=\"BoyId\")\u00a0\u00a0\u00a0\u00a0\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0@Column(name=\"favoriteNumber\",\u00a0nullable=false)\u00a0\u00a0\u00a0\u00a0\u00a0@IndexColumn(name=\"nbr_index\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0int[]\u00a0getFavoriteNumbers()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0favoriteNumbers;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@CollectionOfElements\u00a0\u00a0\u00a0\u00a0\u00a0@AttributeOverride(\u00a0name=\"element.serial\",\u00a0column=@Column(name=\"serial_nbr\")\u00a0)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Toy&gt;\u00a0getFavoriteToys()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0favoriteToys;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@CollectionOfElements\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Set&lt;Character&gt;\u00a0getCharacters()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0characters;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0public\u00a0enum\u00a0Character\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0GENTLE,\u00a0\u00a0\u00a0\u00a0\u00a0NORMAL,\u00a0\u00a0\u00a0\u00a0\u00a0AGGRESSIVE,\u00a0\u00a0\u00a0\u00a0\u00a0ATTENTIVE,\u00a0\u00a0\u00a0\u00a0\u00a0VIOLENT,\u00a0\u00a0\u00a0\u00a0\u00a0CRAFTY\u00a0}\u00a0@Embeddable\u00a0public\u00a0class\u00a0Toy\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0serial;\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Boy\u00a0owner;\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getName()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setName(String\u00a0name)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.name\u00a0=\u00a0name;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getSerial()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0serial;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setSerial(String\u00a0serial)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.serial\u00a0=\u00a0serial;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0@Parent\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Boy\u00a0getOwner()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0owner;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0setOwner(Boy\u00a0owner)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.owner\u00a0=\u00a0owner;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0boolean\u00a0equals(Object\u00a0o)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(\u00a0this\u00a0==\u00a0o\u00a0)\u00a0return\u00a0true;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(\u00a0o\u00a0==\u00a0null\u00a0||\u00a0getClass()\u00a0!=\u00a0o.getClass()\u00a0)\u00a0return\u00a0false;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0final\u00a0Toy\u00a0toy\u00a0=\u00a0(Toy)\u00a0o;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(\u00a0!name.equals(\u00a0toy.name\u00a0)\u00a0)\u00a0return\u00a0false;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(\u00a0!serial.equals(\u00a0toy.serial\u00a0)\u00a0)\u00a0return\u00a0false;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0true;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0int\u00a0hashCode()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0int\u00a0result;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result\u00a0=\u00a0name.hashCode();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result\u00a0=\u00a029\u00a0*\u00a0result\u00a0+\u00a0serial.hashCode();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0result;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<p>\u5728\u5d4c\u5165\u5f0f\u5bf9\u8c61\u7684\u96c6\u5408\u4e2d,\u53ef\u4ee5\u4f7f\u7528\u00a0<tt>@Parent<\/tt>\u6ce8\u89e3\u5d4c\u5165\u5f0f\u5bf9\u8c61\u7684\u67d0\u5c5e\u6027. \u8be5\u5c5e\u6027\u6307\u5411\u8be5\u5d4c\u5165\u5f0f\u5bf9\u8c61\u6240\u5c5e\u7684\u96c6\u5408\u5b9e\u4f53.<\/p>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u65e7\u7248\u7684Hibernate Annotations\u7528<tt>@OneToMany<\/tt>\u6765\u6807\u8bc6\u96c6\u5408\u5143\u7d20. \u7531\u4e8e\u8bed\u4e49\u77db\u76fe,\u6211\u4eec\u5f15\u5165\u4e86<tt>@CollectionOfElements<\/tt>\u6ce8\u89e3. \u7528<tt>@OneToMany<\/tt>\u6765\u6807\u8bc6\u96c6\u5408\u5143\u7d20\u7684\u8fd9\u79cd\u65e7\u6709\u65b9\u5f0f\u76ee\u524d\u5c1a\u6709\u6548, \u4f46\u662f\u4e0d\u63a8\u8350\u4f7f\u7528,\u800c\u4e14\u5728\u4ee5\u540e\u7684\u53d1\u5e03\u7248\u672c\u4e2d\u4e0d\u518d\u652f\u6301\u8fd9\u79cd\u65b9\u5f0f.<\/p>\n<h3><a name=\"d0e2613\"><\/a>2.4.7.\u00a0\u7f13\u5b58<\/h3>\n<p>\u4e3a\u4e86\u4f18\u5316\u6570\u636e\u5e93\u8bbf\u95ee,\u4f60\u53ef\u4ee5\u6fc0\u6d3b\u6240\u8c13\u7684Hibernate\u4e8c\u7ea7\u7f13\u5b58.\u8be5\u7f13\u5b58\u662f\u53ef\u4ee5\u6309\u6bcf\u4e2a\u5b9e\u4f53\u548c\u96c6\u5408\u8fdb\u884c\u914d\u7f6e\u7684.<\/p>\n<p><tt>@org.hibernate.annotations.Cache<\/tt>\u5b9a\u4e49\u4e86\u7f13\u5b58\u7b56\u7565\u53ca\u7ed9\u5b9a\u7684\u4e8c\u7ea7\u7f13\u5b58\u7684\u8303\u56f4. \u6b64\u6ce8\u89e3\u9002\u7528\u4e8e\u6839\u5b9e\u4f53(\u975e\u5b50\u5b9e\u4f53),\u8fd8\u6709\u96c6\u5408.<\/p>\n<pre>@Entity\u00a0@Cache(usage\u00a0=\u00a0CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)\u00a0public\u00a0class\u00a0Forest\u00a0{\u00a0...\u00a0}<\/pre>\n<pre>\u00a0\u00a0\u00a0\u00a0@OneToMany(cascade=CascadeType.ALL,\u00a0fetch=FetchType.EAGER)\u00a0\u00a0\u00a0\u00a0\u00a0@JoinColumn(name=\"CUST_ID\")\u00a0\u00a0\u00a0\u00a0\u00a0@Cache(usage\u00a0=\u00a0CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0SortedSet&lt;Ticket&gt;\u00a0getTickets()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0tickets;\u00a0\u00a0\u00a0\u00a0\u00a0}<\/pre>\n<pre>@Cache(\u00a0\u00a0\u00a0\u00a0\u00a0CacheConcurrencyStrategy\u00a0usage();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(1)\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0region()\u00a0default\u00a0\"\";\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(2)\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0include()\u00a0default\u00a0\"all\";\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(3)\u00a0)<\/pre>\n<table summary=\"Callout list\">\n<tbody>\n<tr class=\"firstRow\">\n<td valign=\"top\" width=\"5%\">(1)<\/td>\n<td valign=\"top\">usage: \u7ed9\u5b9a\u7f13\u5b58\u7684\u5e76\u53d1\u7b56\u7565(NONE, READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(2)<\/td>\n<td valign=\"top\">region (\u53ef\u9009\u7684)\uff1a\u7f13\u5b58\u8303\u56f4(\u9ed8\u8ba4\u4e3a\u7c7b\u7684\u5168\u9650\u5b9a\u7c7b\u540d\u6216\u662f\u96c6\u5408\u7684\u5168\u9650\u5b9a\u89d2\u8272\u540d)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(3)<\/td>\n<td valign=\"top\"><tt>include<\/tt>\u00a0(\u53ef\u9009\u7684)\uff1a\u503c\u4e3aall\u65f6\u5305\u62ec\u4e86\u6240\u6709\u7684\u5c5e\u6027(proterty), \u4e3anon-lazy\u65f6\u4ec5\u542b\u975e\u5ef6\u8fdf\u5c5e\u6027(\u9ed8\u8ba4\u503c\u4e3aall)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><a name=\"d0e2646\"><\/a>2.4.8.\u00a0\u8fc7\u6ee4\u5668<\/h3>\n<p>Hibernate\u5177\u6709\u6570\u636e\u8fc7\u6ee4\u5668\u7684\u6982\u5ff5,\u53ef\u5728\u8fd0\u884c\u671f\u5e94\u7528\u4e8e\u4e00\u4e2a\u7ed9\u5b9a\u7684session.\u8fc7\u6ee4\u5668\u9700\u8981\u4e8b\u5148\u5b9a\u4e49\u597d.<\/p>\n<p><tt>@org.hibernate.annotations.FilterDef<\/tt>\u00a0\u6216\u00a0<tt>@FilterDefs<\/tt>\u00a0\u5b9a\u4e49\u8fc7\u6ee4\u5668\u58f0\u660e,\u4e3a\u540c\u540d\u8fc7\u6ee4\u5668\u6240\u7528. \u8fc7\u6ee4\u5668\u58f0\u660e\u5e26\u6709\u4e00\u4e2aname()\u548c\u4e00\u4e2aparameters()\u6570\u7ec4,<tt>@ParamDef<\/tt>\u5305\u542bname\u548ctype, \u4f60\u8fd8\u53ef\u4ee5\u4e3a\u7ed9\u5b9a\u7684<tt>@filterDef<\/tt>\u5b9a\u4e49\u4e00\u4e2adefaultCondition()\u53c2\u6570, \u5f53<tt>@Filter<\/tt>\u4e2d\u6ca1\u6709\u4efb\u4f55\u5b9a\u4e49\u65f6,\u53ef\u4f7f\u7528\u8be5\u53c2\u6570\u5b9a\u4e49\u7f3a\u7701\u6761\u4ef6.\u00a0<tt>@FilterDef<\/tt>\u00a0(s)\u53ef\u4ee5\u5728\u7c7b\u6216\u5305\u4e00\u7ea7\u8fdb\u884c\u5b9a\u4e49.<\/p>\n<p>\u73b0\u5728\u6211\u4eec\u6765\u5b9a\u4e49\u5e94\u7528\u4e8e\u5b9e\u4f53\u6216\u96c6\u5408\u52a0\u8f7d\u65f6\u7684SQL\u8fc7\u6ee4\u5668\u5b50\u53e5.\u6211\u4eec\u4f7f\u7528<tt>@Filter<\/tt>,\u5e76\u5c06\u5176\u7f6e\u4e8e\u5b9e\u4f53\u6216\u96c6\u5408\u5143\u7d20\u4e0a.<\/p>\n<pre>@Entity\u00a0@FilterDef(name=\"minLength\",\u00a0parameters=@ParamDef(\u00a0name=\"minLength\",\u00a0type=\"integer\"\u00a0)\u00a0)\u00a0@Filters(\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@Filter(name=\"betweenLength\",\u00a0condition=\":minLength\u00a0&lt;=\u00a0length\u00a0and\u00a0:maxLength\u00a0&gt;=\u00a0length\"),\u00a0\u00a0\u00a0\u00a0\u00a0@Filter(name=\"minLength\",\u00a0condition=\":minLength\u00a0&lt;=\u00a0length\")\u00a0}\u00a0)\u00a0public\u00a0class\u00a0Forest\u00a0{\u00a0...\u00a0}<\/pre>\n<h3><a name=\"d0e2678\"><\/a>2.4.9.\u00a0\u67e5\u8be2<\/h3>\n<p>\u7531\u4e8eHibernate\u5f15\u5165\u4e86\u00a0<tt>@org.hibernate.annotations.NamedQuery<\/tt>,\u00a0<tt>@org.hibernate.annotations.NamedQueries<\/tt>,\u00a0<tt>@org.hibernate.annotations.NamedNativeQuery<\/tt>\u00a0\u548c\u00a0<tt>@org.hibernate.annotations.NamedNativeQueries<\/tt>\u00a0\u547d\u540d\u5f0f\u67e5\u8be2, \u56e0\u6b64Hibernate\u5728\u547d\u540d\u5f0f\u67e5\u8be2\u4e0a\u6bd4EBJ3\u89c4\u8303\u4e2d\u6240\u5b9a\u4e49\u7684\u547d\u540d\u5f0f\u67e5\u8be2\u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u7279\u6027. \u4ed6\u4eec\u5728\u6807\u51c6\u7248\u4e2d\u6dfb\u52a0\u4e86\u53ef\u4f5c\u4e3a\u66ff\u4ee3\u54c1\u7684\u4e00\u4e9b\u5c5e\u6027(attributes):<\/p>\n<ul class=\" list-paddingleft-2\" type=\"disc\">\n<li>flushMode: \u5b9a\u4e49\u67e5\u8be2\u7684\u5237\u65b0\u6a21\u5f0f(Always, Auto, Commit\u6216Manual)<\/li>\n<li>cacheable: \u67e5\u8be2\u8be5\u4e0d\u8be5\u88ab\u7f13\u5b58<\/li>\n<li>cacheRegion: \u82e5\u67e5\u8be2\u5df2\u88ab\u7f13\u5b58\u65f6\u6240\u7528\u7f13\u5b58\u7684\u8303\u56f4<\/li>\n<li>fetchSize: \u9488\u5bf9\u8be5\u67e5\u8be2\u7684JDBC statement\u5355\u6b21\u83b7\u53d6\u8bb0\u5f55\u7684\u6570\u76ee<\/li>\n<li>timeout: \u67e5\u8be2\u8d85\u65f6<\/li>\n<li>callable: \u4ec5\u7528\u4e8e\u672c\u5730\u5316\u67e5\u8be2(native query),\u5bf9\u4e8e\u5b58\u50a8\u8fc7\u7a0b\u8bbe\u4e3atrue<\/li>\n<li>comment: \u4e00\u65e6\u6fc0\u6d3b\u6ce8\u91ca\u529f\u80fd,\u6211\u4eec\u4f1a\u5728\u5411\u6570\u636e\u5e93\u4ea4\u9001\u67e5\u8be2\u8bf7\u6c42\u65f6\u770b\u5230\u6ce8\u91ca<\/li>\n<li>cacheMode: \u7f13\u5b58\u4ea4\u62a4\u6a21\u5f0f(get, ignore,normal,\u6216refresh)<\/li>\n<li>readOnly: \u4e0d\u7ba1\u662f\u5426\u4ece\u67e5\u8be2\u83b7\u53d6\u5143\u7d20\u90fd\u662f\u5728\u53ea\u8bfb\u6a21\u5f0f\u4e0b<\/li>\n<\/ul>\n<p>\u6ce8\u610f,EJB3\u5df2\u516c\u5f00\u7684\u6700\u7ec8\u8349\u6848\u4e2d\u5f15\u5165\u4e86<tt>@QueryHint<\/tt>\u7684\u6982\u5ff5, \u8fd9\u53ef\u80fd\u662f\u5b9a\u4e49hints\u66f4\u597d\u7684\u65b9\u6cd5.<\/p>\n<h2><a name=\"xml-overriding\"><\/a>\u7b2c\u00a03\u00a0\u7ae0\u00a0\u901a\u8fc7XML\u8986\u5199\u5143\u6570\u636e<\/h2>\n<p>\u5728EJB3\u4e2d\u5143\u6570\u636e\u7684\u4e3b\u8981\u76ee\u6807\u662f\u4f7f\u7528\u6ce8\u91ca,\u4f46\u662fEJB3\u89c4\u8303\u4e5f\u63d0\u4f9b\u901a\u8fc7XML\u90e8\u7f72\u6587\u4ef6\u6765\u8986\u5199\u6216\u8005\u66ff\u6362\u5143\u6570\u636e\u6ce8\u91ca. \u5728\u5f53\u524d\u7684\u53d1\u5e03\u7248\u672c\u4ec5\u4ec5\u652f\u6301EJB3\u6ce8\u91ca\u7684\u8986\u5199,\u5982\u679c\u4f60\u60f3\u4f7f\u7528Hibernate\u7279\u6709\u7684\u4e00\u4e9b\u5b9e\u4f53\u6ce8\u91ca, \u4f60\u6709\u4e24\u79cd\u9009\u62e9:\u4e00,\u53ea\u4f7f\u7528\u6ce8\u91ca;\u4e8c,\u4f7f\u7528\u539f\u6765\u7684hbm \u6620\u5c04\u6587\u4ef6.\u4f60\u5f53\u7136\u8fd8\u662f\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u6ce8\u91ca\u5b9e\u4f53\u548chbm XML\u6620\u5c04\u6587\u4ef6\u7684\u5b9e\u4f53.<\/p>\n<p>\u5728\u6d4b\u8bd5\u5957\u4ef6\u4e2d\u6709\u4e00\u4e9b\u9644\u52a0\u7684XML\u6587\u4ef6\u7684\u6837\u4f8b.<\/p>\n<h2><a name=\"d0e2735\"><\/a>3.1.\u00a0\u539f\u5219<\/h2>\n<p>XML\u90e8\u7f72\u6587\u4ef6\u7ed3\u6784\u88ab\u8bbe\u8ba1\u4e3a\u76f4\u63a5\u6620\u5c04\u6ce8\u91ca\u7ed3\u6784,\u6240\u4ee5\u5982\u679c\u4f60\u77e5\u9053\u6ce8\u91ca\u7684\u7ed3\u6784,\u90a3\u4e48\u4f7f\u7528XML\u8bed\u6cd5\u662f\u5f88\u7b80\u5355\u7684.<\/p>\n<p>\u4f60\u53ef\u4ee5\u5b9a\u4e49\u4e00\u4e2a\u6216\u8005\u591a\u4e2aXML\u6587\u4ef6\u6765\u63cf\u8ff0\u4f60\u7684\u5143\u6570\u636e,\u8fd9\u4e9b\u6587\u4ef6\u4f1a\u88ab\u8986\u5199\u5f15\u64ce\u5408\u5e76(merged).<\/p>\n<h3><a name=\"d0e2742\"><\/a>3.1.1.\u00a0\u5168\u5c40\u7ea7\u522b\u7684\u5143\u6570\u636e<\/h3>\n<p>\u4f60\u53ef\u4ee5\u4f7f\u7528XML\u6587\u4ef6\u6765\u5b9a\u4e49\u5168\u5c40\u5143\u6570\u636e,\u5bf9\u6bcf\u4e00\u4e2a\u90e8\u7f72\u6587\u4ef6\u4f60\u4e0d\u80fd\u5b9a\u4e49\u591a\u4e8e\u4e00\u4e2a\u7684\u5143\u6570\u636e.<\/p>\n<pre>&lt;?xml\u00a0version=\"1.0\"\u00a0encoding=\"UTF-8\"?&gt;\u00a0&lt;entity-mappings\u00a0\u00a0\u00a0\u00a0xmlns=\"http:\/\/java.sun.com\/xml\/ns\/persistence\/orm\"\u00a0\u00a0\u00a0xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\u00a0\u00a0\u00a0xsi:schemaLocation=\"http:\/\/java.sun.com\/xml\/ns\/persistence\/orm\u00a0orm_1_0.xsd\"\u00a0\u00a0\u00a0version=\"1.0\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;persistence-unit-metadata&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;xml-mapping-metadata-complete\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;persistence-unit-defaults&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;schema&gt;myschema&lt;\/schema&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;catalog&gt;mycatalog&lt;\/catalog&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;cascade-persist\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/persistence-unit-defaults&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/persistence-unit-metadata&gt;<\/pre>\n<p><tt>xml-mapping-metadata-complete<\/tt>\u00a0\u610f\u5473\u7740\u6240\u6709\u7684\u5b9e\u4f53,mapped-superclasses\u548c\u5d4c\u5957\u7684\u5143\u6570\u636e\u5e94\u8be5\u4eceXML\u6587\u4ef6\u4e2d\u542f\u7528(\u5ffd\u7565\u6ce8\u91ca).<\/p>\n<p><tt>schema \/ catalog<\/tt>\u00a0\u5c06\u8986\u5199\u6240\u6709\u5728\u5143\u6570\u636e\u4e2d\u9ed8\u8ba4\u5b9a\u4e49\u7684schema \u548c catalog(\u5305\u62ecXML\u548c\u6ce8\u91ca).<\/p>\n<p><tt>cascade-persist<\/tt>\u00a0\u610f\u5473\u7740\u6240\u6709\u6ce8\u91ca\u4f5c\u4e3a\u4e00\u4e2a cascade type \u90fd\u662fPERSIST\u7684. \u6211\u4eec\u63a8\u8350\u4f60\u4e0d\u8981\u4f7f\u7528\u8be5\u7279\u6027.<\/p>\n<h3><a name=\"d0e2761\"><\/a>3.1.2.\u00a0\u5b9e\u4f53\u7ea7\u522b\u7684\u5143\u6570\u636e<\/h3>\n<p>\u4f60\u4e5f\u53ef\u4ee5\u5728\u4e00\u4e2a\u7ed9\u5b9a\u7684\u5b9e\u4f53\u4e0a\u5b9a\u4e49\u6216\u8005\u8986\u5199\u5143\u6570\u636e<\/p>\n<pre>&lt;?xml\u00a0version=\"1.0\"\u00a0encoding=\"UTF-8\"?&gt;\u00a0&lt;entity-mappings\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(1)\u00a0\u00a0\u00a0xmlns=\"http:\/\/java.sun.com\/xml\/ns\/persistence\/orm\"\u00a0\u00a0\u00a0xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\u00a0\u00a0\u00a0xsi:schemaLocation=\"http:\/\/java.sun.com\/xml\/ns\/persistence\/orm\u00a0orm_1_0.xsd\"\u00a0\u00a0\u00a0version=\"1.0\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;package&gt;org.hibernate.test.annotations.reflection&lt;\/package&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(2)\u00a0\u00a0\u00a0\u00a0\u00a0&lt;entity\u00a0access=\"PROPERTY\"\u00a0metadata-complete=\"true\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(3)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;table\u00a0name=\"tbl_admin\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(4)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;unique-constraint&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column-name&gt;firstname&lt;\/column-name&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column-name&gt;lastname&lt;\/column-name&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/unique-constraint&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/table&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;secondary-table\u00a0name=\"admin2\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(5)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;primary-key-join-column\u00a0name=\"admin_id\"\u00a0referenced-column-name=\"id\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;unique-constraint&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column-name&gt;address&lt;\/column-name&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/unique-constraint&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/secondary-table&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;id-class\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(6)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;inheritance\u00a0strategy=\"JOINED\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(7)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;sequence-generator\u00a0name=\"seqhilo\"\u00a0sequence-name=\"seqhilo\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(8)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;table-generator\u00a0name=\"table\"\u00a0table=\"tablehilo\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(9)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/entity&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;entity&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;primary-key-join-column\u00a0name=\"id\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(10)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/entity&gt;\u00a0&lt;\/entity-mappings&gt;<\/pre>\n<table summary=\"Callout list\">\n<tbody>\n<tr class=\"firstRow\">\n<td valign=\"top\" width=\"5%\">(1)<\/td>\n<td valign=\"top\"><tt>entity-mappings<\/tt>:entity-mappings \u662f\u6240\u6709XML\u6587\u4ef6\u7684\u6839\u5143\u7d20.\u4f60\u5fc5\u987b\u5b9a\u4e49XML Schema, \u8be5\u6587\u4ef6\u5305\u542b\u5728hibernate-annotations.jar\u4e2d,\u4f7f\u7528Hibernate Annotations \u4e0d\u9700\u8981\u8bbf\u95ee\u7f51\u7edc.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(2)<\/td>\n<td valign=\"top\"><tt>package<\/tt>\u00a0(\u53ef\u9009\u7684): \u4f5c\u4e3a\u9ed8\u8ba4\u7684package\u7528\u4e8e\u5728\u4e00\u4e2a\u7ed9\u5b9a\u7684\u90e8\u7f72\u63cf\u8ff0\u6587\u4ef6\u4e2d\u6240\u6709\u6ca1\u6709\u9650\u5b9a\u7684\u7c7b.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(3)<\/td>\n<td valign=\"top\"><tt>entity<\/tt>: \u63cf\u8ff0\u4e00\u4e2a\u5b9e\u4f53.<\/p>\n<p><tt>metadata-complete<\/tt>\u00a0\u5b9a\u4e49\u5bf9\u4e8e\u8be5\u5143\u7d20\u662f\u5426\u5168\u90e8\u4f7f\u7528\u5143\u6570\u636e(\u6362\u53e5\u8bdd\u6765\u8bf4\u5c31\u662f,\u5982\u679c\u6ce8\u91ca\u51fa\u73b0\u5728\u7c7b\u7ea7\u522b\u5e94\u8be5\u8003\u8651\u6216\u8005\u5ffd\u7565).<\/p>\n<p>\u4e00\u4e2a\u5b9e\u4f53\u4e0d\u5f97\u4e0d\u6709\u4e00\u4e2a class \u5c5e\u6027\u6765\u5f15\u7528 \u5143\u6570\u636e\u6240\u5e94\u7528\u7684\u7c7b.<\/p>\n<p>\u901a\u8fc7<tt>name<\/tt>\u5c5e\u6027\u4f60\u53ef\u4ee5\u8986\u5199\u5b9e\u4f53\u7684\u540d\u5b57, \u5982\u679c\u6ca1\u6709\u5b9a\u4e49\u5e76\u4e14<tt>@Entity.name<\/tt>\u51fa\u73b0\u4e86\u7684\u8bdd,\u90a3\u4e48\u5c31\u4f7f\u7528\u8be5\u6ce8\u91ca(\u5047\u5982metadata complete \u6ca1\u6709\u88ab\u8bbe\u7f6e).<\/p>\n<p>\u5bf9\u4e8emetadata complete (\u53c2\u8003\u4e0b\u9762)\u5143\u7d20, \u4f60\u53ef\u4ee5\u5b9a\u4e49\u4e00\u4e2a\u00a0<tt>access<\/tt>(<tt>FIELD<\/tt>\u00a0\u6216\u8005\u00a0<tt>PROPERTY<\/tt>(\u9ed8\u8ba4\u503c)), \u5bf9\u4e8e\u975emetadata complete \u5143\u7d20,\u4f7f\u7528\u6ce8\u91ca\u7684access type.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(4)<\/td>\n<td valign=\"top\"><tt>table<\/tt>: \u4f60\u53ef\u4ee5\u58f0\u660etable \u5c5e\u6027(name, schema, catalog), \u5982\u679c\u6ca1\u6709\u5b9a\u4e49, \u5c06\u4f7f\u7528Java\u6ce8\u91ca.<\/p>\n<p>\u5c31\u8c61\u4f8b\u5b50\u4e2d\u6240\u793a\u7684\u90a3\u6837\u4f60\u53ef\u4ee5\u5b9a\u4e49\u4e00\u4e2a\u6216\u8005\u591a\u4e2aunique constraints<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(5)<\/td>\n<td valign=\"top\"><tt>secondary-table<\/tt>: \u5b9a\u4e49\u4e00\u4e2asecondary-table,\u9664\u4e86\u4f60\u53ef\u4ee5\u901a\u8fc7<tt>primary-key-join-column\u00a0<\/tt>\u5143\u7d20\u5b9a\u4e49 primary key \/ foreign key \u5217\u4ee5\u5916\u662f\u548c\u4e00\u822c\u7684table\u4e00\u6837\u7684. \u5728\u975emetadata complete\u4e0b, annotation secondary tables \u4ec5\u4ec5\u5728\u6ca1\u6709<tt>secondary-table<\/tt>\u5b9a\u4e49\u7684\u60c5\u51b5\u4e0b\u4f7f\u7528, \u5426\u5219 \u6ce8\u91ca\u5c06\u88ab\u5ffd\u7565.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(6)<\/td>\n<td valign=\"top\"><tt>id-class<\/tt>: \u548c<tt>@IdClass<\/tt>\u4e00\u6837\u5b9a\u4e49\u4e00\u4e2aid class.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(7)<\/td>\n<td valign=\"top\"><tt>inheritance<\/tt>: \u5b9a\u4e49\u7ee7\u627f\u7b56\u7565(<tt>JOINED<\/tt>,\u00a0<tt>TABLE_PER_CLASS<\/tt>,\u00a0<tt>SINGLE_TABLE<\/tt>), \u4ec5\u4ec5\u5728\u6839\u5b9e\u4f53\u7ea7\u522b\u53ef\u4ee5\u4f7f\u7528.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(8)<\/td>\n<td valign=\"top\"><tt>sequence-generator<\/tt>: \u5b9a\u4e49\u4e00\u4e2a\u5e8f\u5217\u4ea7\u751f\u5668.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(9)<\/td>\n<td valign=\"top\"><tt>table-generator<\/tt>: \u5b9a\u4e49\u4e00\u4e2atable generator<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(10)<\/td>\n<td valign=\"top\"><tt><tt>primary-key-join-column<\/tt><\/tt>: \u5f53 JOINED \u7ee7\u627f\u7b56\u7565\u4f7f\u7528\u65f6,\u4e3asub entities\u5b9a\u4e49\u4e00\u4e2a primary key join column.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre>&lt;?xml\u00a0version=\"1.0\"\u00a0encoding=\"UTF-8\"?&gt;\u00a0&lt;entity-mappings\u00a0\u00a0\u00a0\u00a0xmlns=\"http:\/\/java.sun.com\/xml\/ns\/persistence\/orm\"\u00a0\u00a0\u00a0xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\u00a0\u00a0\u00a0xsi:schemaLocation=\"http:\/\/java.sun.com\/xml\/ns\/persistence\/orm\u00a0orm_1_0.xsd\"\u00a0\u00a0\u00a0version=\"1.0\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;package&gt;org.hibernate.test.annotations.reflection&lt;\/package&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;entity\u00a0access=\"PROPERTY\"\u00a0metadata-complete=\"true\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;discriminator-value&gt;Generic&lt;\/discriminator-value&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(1)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;discriminator-column\u00a0length=\"34\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/entity&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;entity&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;primary-key-join-column\u00a0name=\"id\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;named-query\u00a0name=\"adminById\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(2)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;query&gt;select\u00a0m\u00a0from\u00a0Administration\u00a0m\u00a0where\u00a0m.id\u00a0=\u00a0:id&lt;\/query&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;hint\u00a0name=\"org.hibernate.timeout\"\u00a0value=\"200\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/named-query&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;named-native-query\u00a0name=\"allAdmin\"\u00a0result-set-mapping=\"adminrs\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(3)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;query&gt;select\u00a0*,\u00a0count(taxpayer_id)\u00a0as\u00a0taxPayerNumber\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0from\u00a0Administration,\u00a0TaxPayer\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0where\u00a0taxpayer_admin_id\u00a0=\u00a0admin_id\u00a0group\u00a0by\u00a0...&lt;\/query&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;hint\u00a0name=\"org.hibernate.timeout\"\u00a0value=\"200\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/named-native-query&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;sql-result-set-mapping\u00a0name=\"adminrs\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(4)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;entity-result\u00a0entity-class=\"Administration\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;field-result\u00a0name=\"name\"\u00a0column=\"fld_name\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/entity-result&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column-result\u00a0name=\"taxPayerNumber\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/sql-result-set-mapping&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;attribute-override\u00a0name=\"ground\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(5)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column\u00a0name=\"fld_ground\"\u00a0unique=\"true\"\u00a0scale=\"2\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/attribute-override&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;association-override\u00a0name=\"referer\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;join-column\u00a0name=\"referer_id\"\u00a0referenced-column-name=\"id\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/association-override&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/entity&gt;\u00a0&lt;\/entity-mappings&gt;<\/pre>\n<table summary=\"Callout list\">\n<tbody>\n<tr class=\"firstRow\">\n<td valign=\"top\" width=\"5%\">(1)<\/td>\n<td valign=\"top\"><tt>discriminator-value \/ discriminator-column<\/tt>: \u5f53SINGLE_TABLE\u7ee7\u627f\u7b56\u7565\u4f7f\u7528\u65f6,\u5b9a\u4e49\u9274\u522b\u5668\u503c \u548c \u4fdd\u5b58\u8be5\u503c\u7684\u5217.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(2)<\/td>\n<td valign=\"top\"><tt>named-query<\/tt>: \u5b9a\u4e49\u547d\u540d\u67e5\u8be2\u548c\u4e00\u4e9b\u76f8\u5173\u7684\u53ef\u80fd\u7684\u7ebf\u7d22. \u8be5\u5b9a\u4e49\u9644\u52a0\u5728\u6ce8\u91ca\u7684\u5b9a\u4e49\u4e2d,\u5982\u679c\u4e24\u4e2a\u90fd\u5b9a\u4e49\u4e86\u76f8\u540c\u7684\u540d\u5b57,\u90a3\u4e48XML\u5c06\u4f18\u5148\u8003\u8651.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(3)<\/td>\n<td valign=\"top\"><tt>named-native-query<\/tt>: \u5b9a\u4e49\u4e00\u4e2a\u547d\u540d\u672c\u5730\u67e5\u8be2 \u548c\u4ed6\u7684 sql result set \u6620\u5c04. \u4f5c\u4e3a\u53e6\u5916\u4e00\u79cd\u9009\u62e9,\u4f60\u53ef\u4ee5\u5b9a\u4e49<tt>result-class<\/tt>. \u8fd9\u4e9b\u5b9a\u4e49\u9644\u52a0\u5728\u6ce8\u91ca\u7684\u5b9a\u4e49\u4e2d.\u5982\u679c\u4e24\u4e2a\u5b9a\u4e49\u4e86\u540c\u6837\u7684\u540d\u5b57,XML\u6587\u4ef6\u4f18\u5148\u8003\u8651.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(4)<\/td>\n<td valign=\"top\"><tt>sql-result-set-mapping<\/tt>: \u63cf\u8ff0\u4e86 result set mapping \u7684\u7ed3\u6784. \u4f60\u53ef\u4ee5\u5b9a\u4e49 \u5b9e\u4f53\u548c\u5217\u6620\u5c04. \u8fd9\u4e9b\u5b9a\u4e49\u9644\u52a0\u5728\u6ce8\u91ca\u7684\u5b9a\u4e49\u4e2d,\u5982\u679c\u5b9a\u4e49\u4e86\u540c\u6837\u7684\u540d\u5b57,XML\u6587\u4ef6\u4f18\u5148\u8003\u8651.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"5%\">(5)<\/td>\n<td valign=\"top\"><tt>attribute-override \/ association-override<\/tt>: \u5b9a\u4e49\u4e00\u5217\u6216\u8005join column overriding. \u8be5overriding \u9644\u52a0\u5728\u6ce8\u91ca\u7684\u5b9a\u4e49\u4e2d.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e00\u4e9b\u5e94\u7528\u4e8e\u00a0<tt>&lt;embeddable&gt;<\/tt>\u00a0\u548c\u00a0<tt>&lt;mapped-superclass&gt;<\/tt>.<\/p>\n<h3><a name=\"d0e2923\"><\/a>3.1.3.\u00a0\u5c5e\u6027\u7ea7\u522b\u7684\u5143\u6570\u636e<\/h3>\n<p>\u4f60\u5f53\u7136\u53ef\u4ee5\u5b9a\u4e49XML\u6765\u8986\u5199\u5c5e\u6027. \u5982\u679cmetadata complete \u7ed9\u5b9a\u4e49\u4e86,\u90a3\u4e48\u9644\u52a0\u7684\u5c5e\u6027(\u5982: \u5728Java \u7ea7\u522b\u7684)\u5c06\u88ab\u5ffd\u7565. \u53e6\u5916,\u4e00\u65e6\u4f60\u5f00\u59cb\u8986\u5199\u4e00\u4e2a\u5c5e\u6027,\u5728\u8be5\u5c5e\u6027\u4e0a\u7684\u6240\u6709\u6ce8\u91ca\u90fd\u4f1a\u88ab\u5ffd\u7565.\u6240\u6709\u5c5e\u6027\u7ea7\u522b\u7684\u5143\u6570\u636e\u5e94\u7528\u4e8e<tt>entity\/attributes<\/tt>,\u00a0<tt>mapped-superclass\/attributes<\/tt>\u6216\u00a0<tt>embeddable\/attributes<\/tt>.<\/p>\n<pre>\u00a0\u00a0\u00a0\u00a0&lt;attributes&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;id\u00a0name=\"id\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column\u00a0name=\"fld_id\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;generated-value\u00a0generator=\"generator\"\u00a0strategy=\"SEQUENCE\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;temporal&gt;DATE&lt;\/temporal&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;sequence-generator\u00a0name=\"generator\"\u00a0sequence-name=\"seq\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/id&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;version\u00a0name=\"version\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;embedded\u00a0name=\"embeddedObject\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;attribute-override\u00a0name\"subproperty\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column\u00a0name=\"my_column\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/attribute-override&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/embedded&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;basic\u00a0name=\"status\"\u00a0optional=\"false\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;enumerated&gt;STRING&lt;\/enumerated&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/basic&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;basic\u00a0name=\"serial\"\u00a0optional=\"true\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column\u00a0name=\"serialbytes\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;lob\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/basic&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;basic\u00a0name=\"terminusTime\"\u00a0fetch=\"LAZY\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;temporal&gt;TIMESTAMP&lt;\/temporal&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/basic&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/attributes&gt;<\/pre>\n<p>\u901a\u8fc7\u00a0<tt>id<\/tt>,\u00a0<tt>embedded-id<\/tt>,\u00a0<tt>version<\/tt>,\u00a0<tt>embedded<\/tt>\u00a0\u548c\u00a0<tt>basic<\/tt>\u4f60\u53ef\u4ee5\u8986\u5199\u4e00\u4e2a\u5c5e\u6027, \u8fd9\u4e9b\u5143\u7d20\u4e2d\u7684\u6bcf\u4e00\u4e2a\u5143\u7d20\u90fd\u6709\u76f8\u5e94\u7684subelements\uff1a<tt>lob<\/tt>,\u00a0<tt>temporal<\/tt>,\u00a0<tt>enumerated<\/tt>,\u00a0<tt>column<\/tt>.<\/p>\n<h3><a name=\"d0e2968\"><\/a>3.1.4.\u00a0\u5173\u8054\u7ea7\u522b\u7684\u5143\u6570\u636e<\/h3>\n<p>\u4f60\u53ef\u4ee5\u5b9a\u4e49XML\u8986\u5199\u5173\u8054\u6ce8\u91ca. \u6240\u6709\u7684\u5173\u8054\u7ea7\u522b\u7684\u5143\u6570\u636e\u4f5c\u7528\u4e8e\u00a0<tt>entity\/attributes<\/tt>,\u00a0<tt>mapped-superclass\/attributes<\/tt>\u00a0\u6216\u00a0<tt>embeddable\/attributes<\/tt>.<\/p>\n<pre>\u00a0\u00a0\u00a0\u00a0&lt;attributes&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;one-to-many\u00a0name=\"players\"\u00a0fetch=\"EAGER\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;map-key\u00a0name=\"name\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;join-column\u00a0name=\"driver\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;join-column\u00a0name=\"number\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/one-to-many&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;many-to-many\u00a0name=\"roads\"\u00a0target-entity=\"Administration\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;order-by&gt;maxSpeed&lt;\/order-by&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;join-table\u00a0name=\"bus_road\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;join-column\u00a0name=\"driver\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;join-column\u00a0name=\"number\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;inverse-join-column\u00a0name=\"road_id\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;unique-constraint&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column-name&gt;driver&lt;\/column-name&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;column-name&gt;number&lt;\/column-name&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/unique-constraint&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/join-table&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/many-to-many&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;many-to-many\u00a0name=\"allTimeDrivers\"\u00a0mapped-by=\"drivenBuses\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/attributes&gt;<\/pre>\n<p>\u901a\u8fc7<tt>one-to-many<\/tt>,\u00a0<tt>one-to-one<\/tt>,\u00a0<tt>many-to-one<\/tt>, \u548c\u00a0<tt>many-to-many<\/tt>. \u4f60\u53ef\u4ee5\u91cd\u5199\u4e00\u4e2a\u5173\u8054\u5173\u7cfb.\u8fd9\u4e9b\u5143\u7d20\u4e2d\u7684\u6bcf\u4e00\u4e2a\u90fd\u6709\u76f8\u5e94\u7684subelements.\u00a0<tt>join-table<\/tt>\u00a0(\u53ef\u4ee5\u6709\u00a0<tt>join-column<\/tt>\u548c\u00a0<tt>inverse-join-column<\/tt>),\u00a0<tt><tt>join-column<\/tt><\/tt>,\u00a0<tt>map-key<\/tt>, \u548c\u00a0<tt>order-by<\/tt>.\u00a0<tt>mapped-by<\/tt>\u00a0\u548c\u00a0<tt>target-entity<\/tt>\u00a0\u5f53\u4ed6\u4eec\u6709\u610f\u4e49\u7684\u65f6\u5019\u53ef\u4ee5\u5b9a\u4e49\u5c5e\u6027. \u518d\u4e00\u6b21\u5f3a\u8c03 \u8be5\u7ed3\u6784\u6620\u5c04\u4e8e\u6ce8\u91ca\u7684\u7ed3\u6784.\u5728\u63cf\u8ff0\u6ce8\u91ca\u7684\u4e00\u7ae0\u4e2d \u4f60\u53ef\u4ee5\u627e\u5230\u6240\u6709\u7684\u8bed\u4e49\u4fe1\u606f.<\/p>\n<h2><a name=\"validator\"><\/a>\u7b2c\u00a04\u00a0\u7ae0\u00a0Hibernate\u9a8c\u8bc1\u5668<\/h2>\n<p>\u6ce8\u89e3\u662f\u4e00\u79cd\u4e3a\u9886\u57df\u6a21\u578b(domain model)\u6307\u5b9a\u4e0d\u53d8\u7ea6\u675f\u7684\u7b80\u6d01\u800c\u5e7d\u96c5\u7684\u65b9\u6cd5\u3002\u4f8b\u5982\uff0c\u4f60\u80fd \u8868\u793a\u4e00\u4e2a\u5c5e\u6027\u6c38\u8fdc\u4e0d\u4e3anull\uff0c\u4e00\u4e2a\u5e10\u6237\u4f59\u989d\u4e00\u5b9a\u662f\u6b63\u503c\uff0c\u7b49\u7b49\u3002\u8fd9\u4e9b\u57df\u6a21\u578b\u7ea6\u675f\u901a\u8fc7\u4e3abean\u4e2d\u7684\u5c5e\u6027\u6dfb\u52a0 \u6ce8\u89e3\u6765\u52a0\u4ee5\u58f0\u660e\u3002\u968f\u540e\u4e00\u4e2a\u9a8c\u8bc1\u5668(validator)\u4f1a\u8bfb\u53d6\u5e76\u68c0\u67e5\u8fd9\u4e9b\u7ea6\u675f\u3002\u9a8c\u8bc1\u673a\u5236\u53ef\u4ee5\u6267\u884c\u4e8e\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684 \u4e0d\u540c\u5c42\uff08\u8868\u73b0\u5c42\u3001\u6570\u636e\u8bbf\u95ee\u5c42\uff09\uff0c\u800c\u4e0d\u5fc5\u590d\u8ff0\u4efb\u4f55\uff08\u524d\u8ff0\uff09\u8fd9\u4e9b\u89c4\u5219\u3002Hibernate\u9a8c\u8bc1\u5668\u6b63\u4e3a\u8fd9\u4e00\u76ee\u7684\u800c\u8bbe\u8ba1\u7684\u3002<\/p>\n<p>Hibernate\u9a8c\u8bc1\u5668\u5de5\u4f5c\u5728\u4e24\u4e2a\u5c42\u6b21\u4e0a\u3002\u7b2c\u4e00\u5c42\uff0c\u5b83\u80fd\u68c0\u67e5\u5185\u5b58\u4e2d\u4e00\u4e2a\u7c7b\u7684\u5b9e\u4f8b\u662f\u5426\u8fdd\u53cd\u7ea6\u675f\u3002 \u7b2c\u4e8c\u5c42\uff0c\u5b83\u80fd\u5c06\u7ea6\u675f\u5e94\u7528\u4e8eHibernate\u5143\u6a21\u578b\u4e0a\uff0c\u5e76\u5c06\u5b83\u4eec\u878d\u5165\u751f\u6210\u7684\u6570\u636e\u5e93schema\u4e2d\u3002<\/p>\n<p>\u6bcf\u4e2a\u7ea6\u675f\u6ce8\u89e3\uff08constraint annotation\uff09\u548c\u4e00\u4e2a\u9a8c\u8bc1\u5668\u5b9e\u73b0\u5173\u8054\uff0c\u8be5\u9a8c\u8bc1\u5668\u8d1f\u8d23\u68c0\u67e5\u4f4d\u4e8e\u5b9e\u4f53\u5b9e\u4f8b\u4e0a\u7684\u7ea6\u675f\u3002 \u4e00\u4e2a\u9a8c\u8bc1\u5668\u4e5f\u80fd(\u53ef\u9009\u5730)\u5c06\u7ea6\u675f\u5e94\u7528\u4e8eHibernate\u5143\u6a21\u578b\u4e0a\uff0c\u8ba9Hibernate\u751f\u6210\u8868\u793a\u8fd9\u4e00\u7ea6\u675f\u7684DDL\u3002\u4f7f\u7528\u5408\u9002\u7684\u4e8b\u4ef6\u76d1\u542c\u5668\uff0c\u4f60\u80fd \u8ba9Hibernate\u5728\u63d2\u5165\u548c\u66f4\u65b0\u65f6\u6267\u884c\u68c0\u67e5\u64cd\u4f5c\u3002Hibernate\u9a8c\u8bc1\u5668\u5e76\u4e0d\u5c40\u9650\u4e8e\u540cHibernate\u4e00\u8d77\u4f7f\u7528\u3002 \u4f60\u80fd\u5728\u4f60\u5e94\u7528\u7a0b\u5e8f\u7684\u4efb\u4f55\u5730\u65b9\u65b9\u4fbf\u5730\u4f7f\u7528\u5b83\u3002<\/p>\n<p>\u5728\u8fd0\u884c\u65f6\u68c0\u67e5\u5b9e\u4f8b\u65f6\uff0cHibernate\u9a8c\u8bc1\u5668\u8fd4\u56de\u8fdd\u53cd\u7ea6\u675f\u7684\u4fe1\u606f\uff0c \u8fd9\u4e9b\u4fe1\u606f\u4ee5\u4e00\u4e2a<tt>InvalidValue<\/tt>\u6570\u7ec4\u7684\u5f62\u5f0f\u8fd4\u56de\u3002 \u9664\u4e86\u4f17\u591a\u5176\u4ed6\u4fe1\u606f\u5916\uff0c<tt>InvalidValue<\/tt>\u5305\u542b\u4e86\u4e00\u4e2a\u9519\u8bef\u63cf\u8ff0\u6d88 \u606f\uff0c\u8be5\u4fe1\u606f\u53ef\u4ee5\u5185\u5d4c\u4e0e\u6ce8\u89e3\u76f8\u6346\u7ed1\u7684\u53c2\u6570\u503c\uff08\u4f8b\u5982\u957f\u5ea6\u9650\u5236\uff09\uff0c\u4ee5\u53ca\u80fd\u88ab\u63d0\u53d6\u81f3ResourceBundle\u7684\u6d88\u606f\u5b57\u4e32\u3002<\/p>\n<h2><a name=\"validator-constraints\"><\/a>4.1.\u00a0\u7ea6\u675f<\/h2>\n<h3><a name=\"d0e3043\"><\/a>4.1.1.\u00a0\u4ec0\u4e48\u662f\u7ea6\u675f\uff1f<\/h3>\n<p>\u7ea6\u675f\u901a\u8fc7\u6ce8\u89e3\u8868\u793a\u3002\u4e00\u4e2a\u7ea6\u675f\u901a\u5e38\u6709\u4e00\u4e9b\u7528\u6765\u53c2\u6570\u5316\u7ea6\u675f\u9650\u5236\u7684\u5c5e\u6027\u3002\u7ea6\u675f\u5e94\u7528\u4e8e\u5e26\u6ce8\u89e3\u7684\u5143\u7d20\u3002<\/p>\n<h3><a name=\"d0e3048\"><\/a>4.1.2.\u00a0\u5185\u5efa\u7ea6\u675f<\/h3>\n<p>Hibernate\u9a8c\u8bc1\u5668\u6709\u4e9b\u5185\u5efa\u7ea6\u675f\uff0c\u8fd9\u4e9b\u7ea6\u675f\u8986\u76d6\u4e86\u5927\u591a\u6570\u7684\u57fa\u672c\u6570\u636e\u68c0\u67e5\u3002\u968f\u540e\u6211\u4eec\u4f1a\u770b\u5230\uff0c \u4f60\u4e0d\u5fc5\u53d7\u5236\u4e8e\u8fd9\u4e9b\u5185\u7f6e\u7ea6\u675f\uff0c\u56e0\u4e3a\u4e00\u5206\u949f\u5185\u5c31\u53ef\u4ee5\u5199\u51fa\u4f60\u81ea\u5df1\u7684\u7ea6\u675f\u3002<\/p>\n<p><a name=\"d0e3053\"><\/a><\/p>\n<p><strong>\u8868\u00a04.1.\u00a0\u5185\u5efa\u7ea6\u675f<\/strong><\/p>\n<table summary=\"\u5185\u5efa\u7ea6\u675f\">\n<colgroup>\n<col \/>\n<col \/>\n<col \/>\n<col \/><\/colgroup>\n<thead>\n<tr class=\"firstRow\">\n<th>\u6ce8\u89e3<\/th>\n<th>\u5e94\u7528\u76ee\u6807<\/th>\n<th>\u8fd0\u884c\u65f6\u68c0\u67e5<\/th>\n<th>Hibernate\u5143\u6570\u636e\u5f71\u54cd<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>@Length(min=, max=)<\/td>\n<td>\u5c5e\u6027(String)<\/td>\n<td>\u68c0\u67e5\u5b57\u7b26\u4e32\u957f\u5ea6\u662f\u5426\u7b26\u5408\u8303\u56f4<\/td>\n<td>\u5217\u957f\u5ea6\u4f1a\u88ab\u8bbe\u5230\u6700\u5927\u503c<\/td>\n<\/tr>\n<tr>\n<td>@Max(value=)<\/td>\n<td>\u5c5e\u6027 (\u4ee5numeric\u6216\u8005string\u7c7b\u578b\u6765\u8868\u793a\u4e00\u4e2a\u6570\u5b57)<\/td>\n<td>\u68c0\u67e5\u503c\u662f\u5426\u5c0f\u4e8e\u6216\u7b49\u4e8e\u6700\u5927\u503c<\/td>\n<td>\u5bf9\u5217\u589e\u52a0\u4e00\u4e2a\u68c0\u67e5\u7ea6\u675f<\/td>\n<\/tr>\n<tr>\n<td>@Min(value=)<\/td>\n<td>\u5c5e\u6027(\u4ee5numeric\u6216\u8005string\u7c7b\u578b\u6765\u8868\u793a\u4e00\u4e2a\u6570\u5b57)<\/td>\n<td>\u68c0\u67e5\u503c\u662f\u5426\u5927\u4e8e\u6216\u7b49\u4e8e\u6700\u5c0f\u503c<\/td>\n<td>\u5bf9\u5217\u589e\u52a0\u4e00\u4e2a\u68c0\u67e5\u7ea6\u675f<\/td>\n<\/tr>\n<tr>\n<td>@NotNull<\/td>\n<td>\u5c5e\u6027<\/td>\n<td>\u68c0\u67e5\u503c\u662f\u5426\u975e\u7a7a(not null)<\/td>\n<td>\u5217\u4e0d\u4e3a\u7a7a<\/td>\n<\/tr>\n<tr>\n<td>@Past<\/td>\n<td>\u5c5e\u6027(date\u6216calendar)<\/td>\n<td>\u68c0\u67e5\u65e5\u671f\u662f\u5426\u662f\u8fc7\u53bb\u65f6<\/td>\n<td>\u5bf9\u5217\u589e\u52a0\u4e00\u4e2a\u68c0\u67e5\u7ea6\u675f<\/td>\n<\/tr>\n<tr>\n<td>@Future<\/td>\n<td>\u5c5e\u6027 (date \u6216 calendar)<\/td>\n<td>\u68c0\u67e5\u65e5\u671f\u662f\u5426\u662f\u5c06\u6765\u65f6<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>@Pattern(regex=&#8221;regexp&#8221;, flag=)<\/td>\n<td>\u5c5e\u6027 (string)<\/td>\n<td>\u68c0\u67e5\u5c5e\u6027\u662f\u5426\u4e0e\u7ed9\u5b9a\u5339\u914d\u6807\u5fd7\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u76f8\u5339\u914d(\u89c1<tt>\u00a0java.util.regex.Pattern\u00a0<\/tt>)<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>@Range(min=, max=)<\/td>\n<td>\u5c5e\u6027(\u4ee5numeric\u6216\u8005string\u7c7b\u578b\u6765\u8868\u793a\u4e00\u4e2a\u6570\u5b57)<\/td>\n<td>\u68c0\u67e5\u503c\u662f\u5426\u5728\u6700\u5c0f\u548c\u6700\u5927\u503c\u4e4b\u95f4(\u5305\u62ec\u4e34\u754c\u503c)<\/td>\n<td>\u5bf9\u5217\u589e\u52a0\u4e00\u4e2a\u68c0\u67e5\u7ea6\u675f<\/td>\n<\/tr>\n<tr>\n<td>@Size(min=, max=)<\/td>\n<td>\u5c5e\u6027 (array, collection, map)<\/td>\n<td>\u68c0\u67e5\u5143\u7d20\u5927\u5c0f\u662f\u5426\u5728\u6700\u5c0f\u548c\u6700\u5927\u503c\u4e4b\u95f4(\u5305\u62ec\u4e34\u754c\u503c)<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>@AssertFalse<\/td>\n<td>\u5c5e\u6027<\/td>\n<td>\u68c0\u67e5\u65b9\u6cd5\u7684\u6f14\u7b97\u7ed3\u679c\u662f\u5426\u4e3afalse(\u5bf9\u4ee5\u4ee3\u7801\u65b9\u5f0f\u800c\u4e0d\u662f\u6ce8\u89e3\u8868\u793a\u7684\u7ea6\u675f\u5f88\u6709\u7528)<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>@AssertTrue<\/td>\n<td>\u5c5e\u6027<\/td>\n<td>\u68c0\u67e5\u65b9\u6cd5\u7684\u6f14\u7b97\u7ed3\u679c\u662f\u5426\u4e3atrue(\u5bf9\u4ee5\u4ee3\u7801\u65b9\u5f0f\u800c\u4e0d\u662f\u6ce8\u89e3\u8868\u793a\u7684\u7ea6\u675f\u5f88\u6709\u7528)<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>@Valid<\/td>\n<td>\u5c5e\u6027 (object)<\/td>\n<td>\u5bf9\u5173\u8054\u5bf9\u8c61\u9012\u5f52\u7684\u8fdb\u884c\u9a8c\u8bc1\u3002\u5982\u679c\u5bf9\u8c61\u662f\u96c6\u5408\u6216\u6570\u7ec4\uff0c\u5c31\u9012\u5f52\u5730\u9a8c\u8bc1\u5176\u5143\u7d20\u3002\u5982\u679c\u5bf9\u8c61\u662fMap\uff0c\u5219\u9012\u5f52\u9a8c\u8bc1\u5176\u503c\u5143\u7d20\u3002<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>@Email<\/td>\n<td>\u5c5e\u6027\uff08String\uff09<\/td>\n<td>\u68c0\u67e5\u5b57\u7b26\u4e32\u662f\u5426\u7b26\u5408\u6709\u6548\u7684email\u5730\u5740\u89c4\u8303\u3002<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><a name=\"validator-constraints-error\"><\/a>4.1.3.\u00a0\u9519\u8bef\u4fe1\u606f<\/h3>\n<p>Hibernate\u9a8c\u8bc1\u5668\u63d0\u4f9b\u4e86\u4e00\u7ec4\u9ed8\u8ba4\u7684\u9519\u8bef\u63d0\u793a\u4fe1\u606f\uff0c\u5b83\u4eec\u88ab\u7ffb\u8bd1\u6210\u591a\u79cd\u8bed\u8a00(\u5982\u679c\u4f60\u7684\u8bed\u8a00\u4e0d\u5728\u5176\u4e2d\uff0c\u8bf7\u7ed9 \u6211\u4eec\u5bc4\u4e00\u4e2a\u8865\u4e01)\u3002\u4f60\u53ef\u4ee5\u5728<tt>org.hibernate.validator.resources.DefaultValidatorMessages.properties<\/tt>\u00a0\u4e4b\u5916\u521b\u5efa<tt>ValidatorMessages.properties<\/tt>\u6216<tt>ValidatorMessages_loc.properties<\/tt>\u00a0\u6587\u4ef6\u5e76\u6539\u53d8\u76f8\u5e94\u7684\u952e\u503c\uff0c\u7c4d\u6b64\u8986\u76d6\u90a3\u4e9b\uff08\u9ed8\u8ba4\uff09\u4fe1\u606f\u3002\u4f60\u751a\u81f3\u53ef\u4ee5\u5728\u5199\u81ea\u5df1\u7684\u9a8c\u8bc1\u5668 \u6ce8\u89e3\u65f6\u6dfb\u52a0\u4f60\u81ea\u5df1\u7684\u9644\u52a0\u6d88\u606f\u96c6\u3002<\/p>\n<p>\u6216\u8005\u4f60\u53ef\u4ee5\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u68c0\u67e5bean\u7684\u9a8c\u8bc1\u89c4\u5219\u5e76\u63d0\u4f9b\u76f8\u5e94\u7684<tt>ResourceBundle<\/tt>\u3002<\/p>\n<h3><a name=\"d0e3208\"><\/a>4.1.4.\u00a0\u7f16\u5199\u4f60\u81ea\u5df1\u7684\u7ea6\u675f<\/h3>\n<p>\u6269\u5c55\u5185\u5efa\u7ea6\u675f\u96c6\u662f\u6781\u5176\u65b9\u4fbf\u7684\u3002\u4efb\u4f55\u7ea6\u675f\u90fd\u5305\u62ec\u4e24\u90e8\u5206\uff1a\u7ea6\u675f<em>\u63cf\u8ff0\u7b26<\/em>(\u6ce8\u89e3) \u548c\u7ea6\u675f<em>\u9a8c\u8bc1\u5668<\/em>(\u5b9e\u73b0\u7c7b)\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u7528\u6237\u5b9a\u4e49\u63cf\u8ff0\u7b26\uff1a<\/p>\n<pre>@ValidatorClass(CapitalizedValidator.class)\u00a0@Target(METHOD)\u00a0\u00a0@Retention(RUNTIME)\u00a0@Documented\u00a0public\u00a0@interface\u00a0Capitalized\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0CapitalizeType\u00a0type()\u00a0default\u00a0Capitalize.FIRST;\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0message()\u00a0default\u00a0\"has\u00a0incorrect\u00a0capitalization\";\u00a0}<\/pre>\n<p><tt>type<\/tt>\u53c2\u6570\u63cf\u8ff0\u5c5e\u6027\u5e94\u8be5\u5982\u4f55\u88ab\u5927\u5199\u3002\u8fd9\u662f\u4e00\u4e2a\u5b8c\u5168\u4f9d\u8d56\u4e8e\u6ce8\u89e3\u4e1a\u52a1(\u903b\u8f91)\u7684\u7528\u6237 \u53c2\u6570\u3002<\/p>\n<p><tt>message<\/tt>\u662f\u7528\u4e8e\u63cf\u8ff0\u7ea6\u675f\u8fdd\u89c4\u7684\u9ed8\u8ba4\u5b57\u7b26\u4e32\uff0c\u5b83\u662f\u5f3a\u5236\u8981\u6c42\u7684\u3002\u4f60\u53ef\u4ee5\u91c7\u53d6\u786c\u7f16\u7801\u7684\u65b9\u5f0f\uff0c \u6216\u8005\u901a\u8fc7Java ResourceBundle\u673a\u5236\u5c06message\u7684\u90e8\u5206\/\u5168\u90e8\u5185\u5bb9\u63d0\u53d6\u81f3\u5916\u90e8\u6587\u4ef6\u3002\u4e00\u65e6\u53d1\u73b0message\u4e2d{parameter}\u5b57\u7b26\u4e32\uff0c \u5c31\u4f1a\u5728{parameter}\u8fd9\u4e2a\u4f4d\u7f6e\u6ce8\u5165\u76f8\u5e94\u7684\u53c2\u6570\u503c(\u5728\u6211\u4eec\u7684\u4f8b\u5b50\u91ccCapitalization is not {type}\u4f1a\u751f\u6210 Capitalization is not FIRST)\uff0c \u53ef\u4ee5\u5c06message\u5bf9\u5e94\u7684\u6574\u4e2a\u5b57\u7b26\u4e32\u63d0\u53d6\u81f3\u5916\u90e8\u6587\u4ef6ValidatorMessages.properties\uff0c\u8fd9\u4e5f\u662f\u4e00\u79cd\u826f\u597d\u5b9e\u8df5\u3002 \u89c1<a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#validator-constraints-error\">Error messages<\/a>\u3002<\/p>\n<pre>@ValidatorClass(CapitalizedValidator.class)\u00a0@Target(METHOD)\u00a0\u00a0@Retention(RUNTIME)\u00a0@Documented\u00a0public\u00a0@interface\u00a0Capitalized\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0CapitalizeType\u00a0type()\u00a0default\u00a0Capitalize.FIRST;\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0message()\u00a0default\u00a0\"{validator.capitalized}\";\u00a0}\u00a0...\u00a0#in\u00a0ValidatorMessages.properties\u00a0validator.capitalized=Capitalization\u00a0is\u00a0not\u00a0{type}<\/pre>\n<p>\u5982\u4f60\u6240\u89c1{}\u7b26\u53f7\u662f\u9012\u5f52\u7684\u3002<\/p>\n<p>\u4e3a\u4e86\u5c06\u4e00\u4e2a\u63cf\u8ff0\u7b26\u8fde\u63a5\u5230\u5b83\u7684\u9a8c\u8bc1\u5668\u5b9e\u73b0\uff0c\u6211\u4eec\u4f7f\u7528<tt>@ValidatorClass<\/tt>\u00a0\u5143\u6ce8\u89e3\u3002\u9a8c\u8bc1\u5668\u7c7b\u53c2\u6570\u5fc5\u987b\u6307\u5b9a\u4e00\u4e2a\u5b9e\u73b0\u4e86<tt>Validator&lt;ConstraintAnnotation&gt;<\/tt>\u00a0\u7684\u7c7b\u3002<\/p>\n<p>\u6211\u4eec\u73b0\u5728\u8981\u5b9e\u73b0\u9a8c\u8bc1\u5668(\u4e5f\u5c31\u662f\u5b9e\u73b0\u89c4\u5219\u68c0\u67e5)\u3002\u4e00\u4e2a\u9a8c\u8bc1\u5668\u5b9e\u73b0\u80fd\u68c0\u67e5\u4e00\u4e2a\u5c5e\u6027\u7684\u503c (\u5b9e\u73b0<tt>PropertyConstraint<\/tt>)\uff0c\u5e76\u4e14\/\u6216\u8005\u53ef\u4ee5\u4fee\u6539hibernate\u6620\u5c04\u5143\u6570\u636e (\u5b9e\u73b0<tt>PersistentClassConstraint<\/tt>)\uff0c\u7c4d\u6b64\u8868\u793a\u6570\u636e\u5e93\u7ea7\u7684\u7ea6\u675f\u3002<\/p>\n<pre>public\u00a0class\u00a0CapitalizedValidator\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0implements\u00a0Validator&lt;Capitalized&gt;,\u00a0PropertyConstraint\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0CapitalizeType\u00a0type;\u00a0\u00a0\u00a0\u00a0\u00a0\/\/part\u00a0of\u00a0the\u00a0Validator&lt;Annotation&gt;\u00a0contract,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/allows\u00a0to\u00a0get\u00a0and\u00a0use\u00a0the\u00a0annotation\u00a0values\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0void\u00a0initialize(Capitalized\u00a0parameters)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type\u00a0=\u00a0parameters.type();\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\/\/part\u00a0of\u00a0the\u00a0property\u00a0constraint\u00a0contract\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0boolean\u00a0isValid(Object\u00a0value)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(value==null)\u00a0return\u00a0true;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(\u00a0!(value\u00a0instanceof\u00a0String)\u00a0)\u00a0return\u00a0false;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0string\u00a0=\u00a0(String)\u00a0value;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(type\u00a0==\u00a0CapitalizeType.ALL)\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0string.equals(\u00a0string.toUpperCase()\u00a0);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0String\u00a0first\u00a0=\u00a0string.substring(0,1);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0first.equals(\u00a0first.toUpperCase();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<p>\u5982\u679c\u8fdd\u53cd\u7ea6\u675f\uff0c<tt>isValid()<\/tt>\u65b9\u6cd5\u5c06\u8fd4\u56defalse\u3002\u66f4\u591a\u4f8b\u5b50\u8bf7\u53c2\u8003\u5185\u5efa\u9a8c\u8bc1\u5668\u5b9e\u73b0\u3002<\/p>\n<p>\u81f3\u6b64\u6211\u4eec\u53ea\u770b\u5230\u5c5e\u6027\u7ea7\u7684\u9a8c\u8bc1\uff0c\u4f60\u8fd8\u53ef\u4ee5\u5199\u4e00\u4e2aBean\u7ea7\u522b\u7684\u9a8c\u8bc1\u6ce8\u89e3\u3002Bean\u81ea\u8eab\u4f1a\u88ab\u4f20\u9012\u7ed9\u9a8c\u8bc1\u5668\uff0c \u800c\u4e0d\u662fbean\u7684\u5c5e\u6027\u5b9e\u4f8b\u3002\u53ea\u8981\u5bf9bean\u81ea\u8eab\u8fdb\u884c\u6ce8\u89e3\u5373\u53ef\u6fc0\u6d3b\u9a8c\u8bc1\u68c0\u67e5\u3002\u5728\u5355\u5143\u6d4b\u8bd5\u5957\u4ef6\u4e2d\u8fd8\u53ef\u4ee5\u627e\u5230\u4e00\u4e2a\u5c0f\u4f8b\u5b50\u3002<\/p>\n<h3><a name=\"d0e3262\"><\/a>4.1.5.\u00a0\u6ce8\u89e3\u4f60\u7684\u9886\u57df\u6a21\u578b<\/h3>\n<p>\u65e2\u7136\u4f60\u73b0\u5728\u5df2\u7ecf\u719f\u6089\u6ce8\u89e3\u4e86\uff0c\u90a3\u4e48\u5bf9\u8bed\u6cd5\u4e5f\u5e94\u8be5\u5f88\u6e05\u695a\u4e86\u3002<\/p>\n<pre>public\u00a0class\u00a0Address\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0line1;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0line2;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0zip;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0state;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0String\u00a0country;\u00a0\u00a0\u00a0\u00a0\u00a0private\u00a0long\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0a\u00a0not\u00a0null\u00a0string\u00a0of\u00a020\u00a0characters\u00a0maximum\u00a0\u00a0\u00a0\u00a0\u00a0@Length(max=20)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@NotNull\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getCountry()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0country;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0a\u00a0non\u00a0null\u00a0string\u00a0\u00a0\u00a0\u00a0\u00a0@NotNull\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getLine1()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0line1;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\/\/no\u00a0constraint\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getLine2()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0line2;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0a\u00a0not\u00a0null\u00a0string\u00a0of\u00a03\u00a0characters\u00a0maximum\u00a0\u00a0\u00a0\u00a0\u00a0@Length(max=3)\u00a0@NotNull\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getState()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0state;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0a\u00a0not\u00a0null\u00a0numeric\u00a0string\u00a0of\u00a05\u00a0characters\u00a0maximum\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0if\u00a0the\u00a0string\u00a0is\u00a0longer,\u00a0the\u00a0message\u00a0will\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/be\u00a0searched\u00a0in\u00a0the\u00a0resource\u00a0bundle\u00a0at\u00a0key\u00a0'long'\u00a0\u00a0\u00a0\u00a0\u00a0@Length(max=5,\u00a0message=\"{long}\")\u00a0\u00a0\u00a0\u00a0\u00a0@Pattern(regex=\"[0-9]+\")\u00a0\u00a0\u00a0\u00a0\u00a0@NotNull\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getZip()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0zip;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0should\u00a0always\u00a0be\u00a0true\u00a0\u00a0\u00a0\u00a0\u00a0@AssertTrue\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0boolean\u00a0isValid()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0true;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a0a\u00a0numeric\u00a0between\u00a01\u00a0and\u00a02000\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0@Min(1)\u00a0\u00a0\u00a0\u00a0\u00a0@Range(max=2000)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0long\u00a0getId()\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0id;\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0}<\/pre>\n<p>\u4e0a\u9762\u7684\u4f8b\u5b50\u53ea\u5c55\u793a\u4e86\u516c\u5171\u5c5e\u6027\u9a8c\u8bc1\uff0c\u4f60\u8fd8\u53ef\u4ee5\u5bf9\u4efb\u4f55\u53ef\u89c1\u5ea6\u7684\u5b57\u6bb5(field)\u8fdb\u884c\u6ce8\u89e3\u3002<\/p>\n<pre>@MyBeanConstraint(max=45)\u00a0public\u00a0class\u00a0Dog\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@AssertTrue\u00a0private\u00a0boolean\u00a0isMale;\u00a0\u00a0\u00a0\u00a0\u00a0@NotNull\u00a0protected\u00a0String\u00a0getName()\u00a0{\u00a0...\u00a0};\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u4f60\u53ef\u4ee5\u5bf9\u63a5\u53e3\u8fdb\u884c\u6ce8\u89e3\u3002Hibernate\u9a8c\u8bc1\u5668\u4f1a\u68c0\u67e5\u7ed9\u5b9abean\u6240\u6269\u5c55\u6216\u5b9e\u73b0\u7684\u6240\u6709\u7236\u7c7b\u548c\u63a5\u53e3\uff0c \u7c4d\u4ee5\u8bfb\u53d6\u76f8\u5e94\u7684\u9a8c\u8bc1\u5668\u6ce8\u89e3(\u4fe1\u606f)\u3002<\/p>\n<pre>public\u00a0interface\u00a0Named\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@NotNull\u00a0String\u00a0getName();\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}\u00a0public\u00a0class\u00a0Dog\u00a0implements\u00a0Named\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0@AssertTrue\u00a0private\u00a0boolean\u00a0isMale;\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getName()\u00a0{\u00a0...\u00a0};\u00a0}<\/pre>\n<p>\u5728\u9a8c\u8bc1Dog bean\u65f6\u4f1a\u68c0\u67e5name\u5c5e\u6027\u7684\u6709\u6548\u6027(\u4e0d\u4e3anull)\u3002<\/p>\n<h2><a name=\"d0e3279\"><\/a>4.2.\u00a0\u4f7f\u7528\u9a8c\u8bc1\u5668\u6846\u67b6<\/h2>\n<p>Hibernate\u9a8c\u8bc1\u5668\u65e8\u5728\u5b9e\u73b0\u591a\u5c42\u6570\u636e\u9a8c\u8bc1\uff0c\u6211\u4eec\u5728\u4e00\u5904\u8868\u793a\u7ea6\u675f(\u5e26\u6ce8\u89e3\u7684\u57df\u6a21\u578b)\uff0c\u7136\u540e\u5c06\u5176\u8fd0\u7528\u4e8e \u5e94\u7528\u7a0b\u5e8f\u7684\u4e0d\u540c\u5c42\u3002<\/p>\n<h3><a name=\"d0e3284\"><\/a>4.2.1.\u00a0\u6570\u636e\u5e93schema\u5c42\u6b21\u9a8c\u8bc1<\/h3>\n<p>\u65e0\u987b\u989d\u5916\u624b\u7eed\uff0cHibernate Annotations\u4f1a\u81ea\u52a8\u5c06\u4f60\u4e3a\u5b9e\u4f53\u5b9a\u4e49\u7684\u7ea6\u675f\u7ffb\u8bd1\u4e3a\u6620\u5c04\u5143\u6570\u636e\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4f60\u7684\u5b9e\u4f53 \u7684\u4e00\u4e2a\u5c5e\u6027\u6ce8\u89e3\u4e3a<tt>@NotNull<\/tt>\uff0c\u5728Hibernate\u751f\u6210\u7684DDL schema\u4e2d\u8fd9\u5217\u4f1a\u88ab\u5b9a\u4e49\u4e3a\u00a0<tt>not null<\/tt>\u3002<\/p>\n<h3><a name=\"d0e3295\"><\/a>4.2.2.\u00a0Hibernate\u57fa\u4e8e\u4e8b\u4ef6\u7684\u9a8c\u8bc1<\/h3>\n<p>Hibernate\u9a8c\u8bc1\u5668\u6709\u4e24\u4e2a\u5185\u5efaHibernate\u4e8b\u4ef6\u76d1\u542c\u5668\u3002\u5f53\u4e00\u4e2a<tt>PreInsertEvent<\/tt>\u00a0\u6216<tt>PreUpdateEvent<\/tt>\u53d1\u751f\u65f6\uff0c\u76d1\u542c\u5668\u4f1a\u9a8c\u8bc1\u8be5\u5b9e\u4f53\u5b9e\u4f8b\u7684\u6240\u6709\u7ea6\u675f\uff0c\u5982\u6709\u8fdd\u53cd\u4f1a\u629b\u51fa\u4e00\u4e2a\u5f02\u5e38\u3002 \u57fa\u672c\u4e0a\uff0c\u5728Hibernate\u6267\u884c\u4efb\u4f55\u63d2\u5165\u548c\u66f4\u65b0\u524d\u5bf9\u8c61\u4f1a\u88ab\u68c0\u67e5\u3002\u8fd9\u662f\u6fc0\u6d3b\u9a8c\u8bc1\u8fc7\u7a0b\u7684\u6700\u4fbf\u6377\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u3002\u5f53\u9047\u5230\u7ea6\u675f \u8fdd\u89c4\u65f6\uff0c\u4e8b\u4ef6\u4f1a\u5f15\u53d1\u4e00\u4e2a\u8fd0\u884c\u65f6<tt>InvalidStateException<\/tt>\uff0c\u8be5\u5f02\u5e38\u5305\u542b\u4e00\u4e2a\u63cf\u8ff0\u6bcf\u4e2a\u9519\u8bef\u7684\u00a0<tt>InvalidValue<\/tt>\u6570\u7ec4\u3002<\/p>\n<pre>&lt;hibernate-configuration&gt;\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0&lt;event\u00a0type=\"pre-update\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;listener\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0class=\"org.hibernate.validator.event.ValidatePreUpdateEventListener\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/event&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;event\u00a0type=\"pre-insert\"&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;listener\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0class=\"org.hibernate.validator.event.ValidatePreInsertEventListener\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/event&gt;\u00a0&lt;\/hibernate-configuration&gt;<\/pre>\n<h3>\u6ce8\u610f<\/h3>\n<p>\u5728\u4f7f\u7528Hibernate Entity Manager\u65f6\uff0cValidation\u6846\u67b6\u4f1a\u88ab\u81ea\u52a8\u6fc0\u6d3b\u3002\u5982\u679cbean\u4e0d\u5e26\u9a8c\u8bc1\u6ce8\u89e3\uff0c \u5c31\u4e0d\u4f1a\u6709\u6027\u80fd\u635f\u5931\u3002<\/p>\n<h3><a name=\"d0e3318\"><\/a>4.2.3.\u00a0\u7a0b\u5e8f\u7ea7\u9a8c\u8bc1<\/h3>\n<p>Hibernate\u9a8c\u8bc1\u5668\u80fd\u5e94\u7528\u4e8e\u4f60\u5e94\u7528\u7a0b\u5e8f\u4ee3\u7801\u4e2d\u7684\u4efb\u4f55\u5730\u65b9\u3002<\/p>\n<pre>ClassValidator\u00a0personValidator\u00a0=\u00a0new\u00a0ClassValidator(\u00a0Person.class\u00a0);\u00a0ClassValidator\u00a0addressValidator\u00a0=\u00a0new\u00a0ClassValidator(\u00a0Address.class,\u00a0ResourceBundle.getBundle(\"messages\",\u00a0Locale.ENGLISH)\u00a0);\u00a0InvalidValue[]\u00a0validationMessages\u00a0=\u00a0addressValidator.getInvalidValues(address);<\/pre>\n<p>\u5934\u4e24\u884c\u4e3a\u6267\u884c\u7c7b\u68c0\u67e5\u800c\u51c6\u5907Hibernate\u9a8c\u8bc1\u5668\u3002\u7b2c\u4e00\u884c\u4f9d\u8d56\u4e8e\u5d4c\u5165\u5728Hibernate\u9a8c\u8bc1\u5668\u5185\u7684\u9519\u8bef \u6d88\u606f(\u89c1<a href=\"http:\/\/docs.jboss.org\/hibernate\/annotations\/3.4\/reference\/zh_cn\/html_single\/#validator-constraints-error\">Error messages<\/a>)\uff0c\u7b2c\u4e8c\u884c\u4e3a\u8fd9\u4e9b\u6d88\u606f\u51c6\u5907\u8d44\u6e90\u5305\u3002\u8fd9\u4e9b\u4ee3\u7801\u53ea\u6267\u884c\u4e00\u6b21\uff0c \u5e76\u5c06\u9a8c\u8bc1\u5668\u8fdb\u884c\u7f13\u5b58\u5904\u7406\uff0c\u8fd9\u79cd\u65b9\u5f0f\u662f\u4e00\u79cd\u826f\u597d\u5b9e\u8df5\u3002<\/p>\n<p>\u7b2c\u4e09\u884c\u771f\u6b63\u9a8c\u8bc1\u4e86<tt>Address<\/tt>\u5b9e\u4f8b\u5e76\u8fd4\u56de\u4e00\u4e2a<tt>InvalidValue<\/tt>\u6570\u7ec4\u3002 \u4f60\u7684\u5e94\u7528\u7a0b\u5e8f\u903b\u8f91\u968f\u540e\u53ef\u4ee5\u5bf9\u9519\u8bef\u505a\u51fa\u54cd\u5e94\u3002<\/p>\n<p>\u9664\u4e86\u9488\u5bf9\u6574\u4e2abean\u4f60\u8fd8\u53ef\u4ee5\u5bf9\u67d0\u4e2a\u7279\u5b9a\u5c5e\u6027\u8fdb\u884c\u68c0\u67e5\u3002\u8fd9\u5bf9\u4e8e\u4e00\u4e2a\u5c5e\u6027\u4e00\u4e2a\u5c5e\u6027\u7684\u7528\u6237\u4ea4\u4e92\u60c5\u5f62\u6216\u8bb8\u662f\u6709\u7528\u7684\u3002<\/p>\n<pre>ClassValidator\u00a0addressValidator\u00a0=\u00a0new\u00a0ClassValidator(\u00a0Address.class,\u00a0ResourceBundle.getBundle(\"messages\",\u00a0Locale.ENGLISH)\u00a0);\u00a0\/\/only\u00a0get\u00a0city\u00a0property\u00a0invalid\u00a0values\u00a0InvalidValue[]\u00a0validationMessages\u00a0=\u00a0addressValidator.getInvalidValues(address,\u00a0\"city\");\u00a0\/\/only\u00a0get\u00a0potential\u00a0city\u00a0property\u00a0invalid\u00a0values\u00a0InvalidValue[]\u00a0validationMessages\u00a0=\u00a0addressValidator.getPotentialInvalidValues(\"city\",\u00a0\"Paris\")<\/pre>\n<h3><a name=\"d0e3341\"><\/a>4.2.4.\u00a0\u9a8c\u8bc1\u4fe1\u606f<\/h3>\n<p>\u4f5c\u4e3a\u4e00\u4e2a\u9a8c\u8bc1\u4fe1\u606f\u7684\u8f7d\u4f53\uff0chibernate\u63d0\u4f9b\u4e86\u4e00\u4e2a<tt>InvalidValue<\/tt>\u6570\u7ec4\u3002 \u6bcf\u4e2a<tt>InvalidValue<\/tt>\u6709\u4e00\u7ec4\uff0c\u8fd9\u4e9b\u65b9\u6cd5\u5206\u522b\u63cf\u8ff0\u76f8\u5e94\u7684\u4e2a\u4f53\u95ee\u9898\u3002<\/p>\n<p><tt>getBeanClass()<\/tt>\u83b7\u53d6\u5931\u8d25\u7684bean\u7c7b\u578b\u3002<\/p>\n<p><tt>getBean()<\/tt>\u83b7\u53d6\u9a8c\u8bc1\u5931\u8d25\u7684\u5b9e\u4f8b(\u5982\u679c\u6709\u7684\u8bdd\uff0c\u5f53\u4f7f\u7528\u00a0<tt>getPotentianInvalidValues()<\/tt>\u65f6\u5219\u4e0d\u4f1a\u53d6\u5230)<\/p>\n<p><tt>getValue()<\/tt>\u83b7\u53d6\u9a8c\u8bc1\u5931\u8d25\u7684\u503c<\/p>\n<p><tt>getMessage()<\/tt>\u83b7\u53d6\u5408\u9002\u7684\u56fd\u9645\u5316\u9519\u8bef\u6d88\u606f<\/p>\n<p><tt>getRootBean()<\/tt>\u83b7\u53d6\u4ea7\u751f\u95ee\u9898\u7684\u6839bean\u5b9e\u4f8b(\u5728\u4e0e<tt>@Valid<\/tt>\u8fde\u7528 \u65f6\u5f88\u6709\u7528)\uff0c\u5982\u7528getPotentianInvalidValues()\u5219\u8fd4\u56denull\u3002<\/p>\n<p><tt>getPropertyPath()<\/tt>\u83b7\u53d6\u201c\u95ee\u9898\u201d\u5c5e\u6027\u4ece\u6839bean\u5f00\u59cb\u7684\u5e26\u70b9\u7684\u8def\u5f84<\/p>\n<h2><a name=\"lucene\"><\/a>\u7b2c\u00a05\u00a0\u7ae0\u00a0Hibernate\u4e0eLucene\u96c6\u6210<\/h2>\n<p>Lucene\u662f\u4e00\u4e2a\u9ad8\u6027\u80fd\u7684java\u641c\u7d22\u5f15\u64ce\u5e93\uff0c\u53ef\u4ee5\u4ece Apache\u8f6f\u4ef6\u57fa\u91d1\u7ec4\u7ec7\u83b7\u53d6\u3002 Hibernate Annotations\u5305\u62ec\u4e00\u4e2a\u6ce8\u89e3\u5305\uff0c\u5b83\u5141\u8bb8\u628a\u4efb\u4f55\u57df\u6a21\u578b\u5bf9\u8c61\u6807\u8bb0\u4e3a\u53ef\u7d22\u5f15\u7684\uff0c \u5e76\u4e14\u5bf9\u4efb\u4f55\u7ecf\u7531Hibernate\u8fdb\u884c\u6301\u7eed\u5316\u7684\u5b9e\u4f8b\uff0cHibernate \u90fd\u4f1a\u4e3a\u4e4b\u7ef4\u62a4\u4e00\u4e2a\u5bf9\u5e94\u7684Lucene\u7d22\u5f15\u3002<\/p>\n<h2><a name=\"lucene-intro\"><\/a>5.1.\u00a0\u4f7f\u7528Lucene\u4e3a\u5b9e\u4f53\u5efa\u7acb\u7d22\u5f15<\/h2>\n<h3><a name=\"d0e3390\"><\/a>5.1.1.\u00a0\u6ce8\u89e3\u9886\u57df\u6a21\u578b<\/h3>\n<p>\u9996\u5148\uff0c\u5fc5\u987b\u5c06\u4e00\u4e2a\u6301\u4e45\u7c7b\u58f0\u660e\u4e3a\u00a0<tt>@Indexed<\/tt>:<\/p>\n<pre>@Entity\u00a0@Indexed(index=\"indexes\/essays\")\u00a0public\u00a0class\u00a0Essay\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0}<\/pre>\n<p>\u5c5e\u6027<tt>index<\/tt>\u662f\u544a\u8bc9Hibernate\uff0c Lucene\u7d22\u5f15\u4fe1\u606f\u6240\u5728\u7684\u4f4d\u7f6e\uff08\u4f60\u6587\u4ef6\u7cfb\u7edf\u7684\u67d0\u4e2a\u76ee\u5f55\uff09\u3002 \u5982\u679c\u4f60\u60f3\u4e3a\u6240\u6709\u7684Lucene\u7d22\u5f15\u5b9a\u4e49\u4e00\u4e2a\u6839\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u7528\u5c5e\u6027<tt>hibernate.lucene.index_dir<\/tt>\u8fdb\u884c\u914d\u7f6e\u3002<\/p>\n<p>Lucene\u7d22\u5f15\u5305\u62ec\u56db\u79cd\u5b57\u6bb5\uff1a<em>keyword<\/em>\u00a0\u5b57\u6bb5\uff0c<em>text<\/em>\u00a0\u5b57\u6bb5\uff0c<em>unstored<\/em>\u5b57\u6bb5\u548c<em>unindexed<\/em>\u5b57\u6bb5\u3002 Hibernate\u6ce8\u89e3\u63d0\u4f9b\u4e86\u5c06\u5b9e\u4f53\u5c5e\u6027\u6807\u8bb0\u4e3a\u524d\u4e09\u79cd\u88ab\u7d22\u5f15\u5b57\u6bb5\u7684\u6ce8\u89e3\u3002<\/p>\n<pre>@Entity\u00a0@Indexed(index=\"indexes\/essays\")\u00a0public\u00a0class\u00a0Essay\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0@Id\u00a0\u00a0\u00a0\u00a0\u00a0@Keyword(id=true)\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0Long\u00a0getId()\u00a0{\u00a0return\u00a0id;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Text(name=\"Abstract\")\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getSummary()\u00a0{\u00a0return\u00a0summary;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Lob\u00a0\u00a0\u00a0\u00a0\u00a0@Unstored\u00a0\u00a0\u00a0\u00a0\u00a0public\u00a0String\u00a0getText()\u00a0{\u00a0return\u00a0text;\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/pre>\n<p>\u8fd9\u4e9b\u6ce8\u89e3\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5e26\u6709\u4e09\u4e2a\u5b57\u6bb5\u7684\u7d22\u5f15:\u00a0<tt>Id<\/tt>,\u00a0<tt>Abstract<\/tt>\u00a0\u548c\u00a0<tt>Text<\/tt>.<\/p>\n<p>\u6ce8\u610f:\u4f60\u5fc5\u987b\u5728\u4f60\u7684\u5b9e\u4f53\u7c7b\u7684\u6807\u5fd7\u5c5e\u6027\u4e0a\u6307\u5b9a\u00a0<tt>@Keyword(id=true)<\/tt>\u00a0.<\/p>\n<p>\u7528\u4e8e\u5bf9\u5143\u7d20\u5efa\u7acb\u7d22\u5f15\u7684\u5206\u6790\u5668\u7c7b\u662f\u53ef\u4ee5\u901a\u8fc7<tt>hibernate.lucene.analyzer<\/tt>\u5c5e\u6027\u8fdb\u884c\u914d\u7f6e\u7684\u3002 \u5982\u679c\u6ca1\u6709\u5b9a\u4e49\uff0c\u5219\u628a\u00a0<tt>org.apache.lucene.analysis.standard.StandardAnalyzer<\/tt>\u4f5c\u4e3a\u7f3a\u7701\u3002<\/p>\n<h3><a name=\"d0e3448\"><\/a>5.1.2.\u00a0\u542f\u7528\u81ea\u52a8\u7d22\u5f15<\/h3>\n<p>\u6211\u4eec\u6fc0\u6d3b\u7528\u4e8e\u5e27\u542c\u4e09\u7c7bHibernate\u4e8b\u4ef6\u7684\u00a0<tt>LuceneEventListener<\/tt>\uff0c \u8fd9\u4e9b\u4e8b\u4ef6\u4f1a\u5728\u53d8\u66f4\u88ab\u63d0\u4ea4\u81f3\u6570\u636e\u5e93\u540e\u4ea7\u751f\u3002<\/p>\n<pre>&lt;hibernate-configuration&gt;\u00a0\u00a0\u00a0\u00a0\u00a0...\u00a0\u00a0\u00a0\u00a0\u00a0&lt;event\u00a0type=\"post-commit-update\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;listener\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0class=\"org.hibernate.lucene.event.LuceneEventListener\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/event&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;event\u00a0type=\"post-commit-insert\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;listener\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0class=\"org.hibernate.lucene.event.LuceneEventListener\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/event&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;event\u00a0type=\"post-commit-delete\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;listener\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0class=\"org.hibernate.lucene.event.LuceneEventListener\"\/&gt;\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/event&gt;\u00a0&lt;\/hibernate-configuration&gt;<\/pre>\n<h2><a name=\"d0e3458\"><\/a>\u9644\u5f55\u00a0A.\u00a0\u672f\u8bed\u8868<\/h2>\n<p>Redsaga\u7684wiki\u4e0a\u7ef4\u62a4\u4e86\u672c\u6587\u7ffb\u8bd1\u8fc7\u7a0b\u4e2d\u6240\u53c2\u7167\u7684\u4e2d\u82f1\u6587\u5bf9\u7167\u7684\u672f\u8bed\u8868,\u5730\u5740:http:\/\/wiki.redsaga.com\/confluence\/display\/HART\/glossary.<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-125","post","type-post","status-publish","format-standard","hentry","category-hibernate"],"_links":{"self":[{"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/posts\/125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=125"}],"version-history":[{"count":0,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=\/wp\/v2\/posts\/125\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dd-home.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dd-home.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}