蜜月aⅴ免费一区二区三区,亚洲va欧美va天堂v国产综合,色综合成人avhttp://www.aygfsteel.com/hwpok/category/33303.htmlDEBUGzh-cnMon, 10 Jan 2011 01:48:56 GMTMon, 10 Jan 2011 01:48:56 GMT60Hibernate formulahttp://www.aygfsteel.com/hwpok/archive/2011/01/09/342633.html無名氏無名氏Sun, 09 Jan 2011 12:32:00 GMThttp://www.aygfsteel.com/hwpok/archive/2011/01/09/342633.htmlhttp://www.aygfsteel.com/hwpok/comments/342633.htmlhttp://www.aygfsteel.com/hwpok/archive/2011/01/09/342633.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/342633.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/342633.html<property name="age" formula="(select round((to_number(sysdate - nvl(birth_day, sysdate))/360)) from es_sms_customer a where a.id=ID)"/>
 
<property name="age" formula="(select round((to_number(sysdate - nvl(BIRTH_DAY, sysdate))/360)) from dual)"/> formula 是一個很有用的東東

無名氏 2011-01-09 20:32 發表評論
]]>
為Hibernate配置文件加密的三套解決方案(一)http://www.aygfsteel.com/hwpok/archive/2010/05/31/322356.html無名氏無名氏Mon, 31 May 2010 09:07:00 GMThttp://www.aygfsteel.com/hwpok/archive/2010/05/31/322356.htmlhttp://www.aygfsteel.com/hwpok/comments/322356.htmlhttp://www.aygfsteel.com/hwpok/archive/2010/05/31/322356.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/322356.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/322356.htmlHibernate配置文件hibernate.cfg.xml中存放了我們連接數據庫的相關信息,其中設計到許多數據庫的敏感信息,比如連接地址,用戶名和密碼,有時候我們交由發布組進行發布時并不希望他們看到數據庫的連接密碼,就需要對hibernate配置文件中的部分信息進行加密,我在解決這一問題中實踐了三種方法,第一種是重載連接供應器,第二種是使用Hibernate官方推薦的Jasypt,第三種其實算不上是加密,而是使用WebLogic連接池將相關信息放在WebLogic的配置中,下面會具體闡述這三種方法。

第一種重載連接供應器:
這種方法是我在網上看到的,原文連接是:
http://blog.csdn.net/sdbany/archive/2008/10/23/3132809.aspx

但是在實際使用的時候發現代碼有問題,可能是作者沒有貼全,所以有些功能無法實現,于是我重新寫了代碼。

首先創建一個連接供應器,配置文件里的參數解釋都是此類負責,所以,只要在此類中進行密文解密即可。
Java代碼
  1. import java.util.Properties;   
  2.   
  3. import org.hibernate.HibernateException;   
  4. import org.hibernate.cfg.Environment;   
  5. import org.hibernate.connection.DriverManagerConnectionProvider;   
  6.   
  7. public class CustomDriverManagerConnectionProvider extends  
  8.         DriverManagerConnectionProvider {   
  9.   
  10.     public CustomDriverManagerConnectionProvider() {   
  11.         super();   
  12.     }   
  13.        
  14.     @Override  
  15.     public void configure(Properties props) throws HibernateException{   
  16.         String user = props.getProperty(Environment.USER);   
  17.         String password = props.getProperty(Environment.PASS);   
  18.         props.setProperty(Environment.USER, SecUtil.decrypt(user));   
  19.         props.setProperty(Environment.PASS, SecUtil.decrypt(password));   
  20.         super.configure(props);   
  21.     }   
  22.        
  23. }  

再寫一個類,使用AES負責字符串的加密與解密這里我們參照原作者的方法
Java代碼
  1. /**  
  2.  * AES加密工具  
  3.  *   
  4.  * @author Bany  
  5.  *   
  6.  * @version 創建時間:2008-8-5 上午10:58:16  
  7.  *   
  8.  */  
  9.   
  10. public class SecUtil {   
  11.   
  12.     private static byte[] keybytes = { 0x310x32, …… };   
  13.   
  14.     public static void main(String[] args) throws Exception {   
  15.         String e1 = encrypt("newpassword");   
  16.         System.out.println(e1);   
  17.         String e2 = decrypt(e1);   
  18.         System.out.println(e2);   
  19.     }   
  20.   
  21.     /**  
  22.      * 加密  
  23.      * @param value  
  24.      * @return  
  25.      */  
  26.     public static String encrypt(String value) {   
  27.            
  28.         String s=null;   
  29.   
  30.         int mode = Cipher.ENCRYPT_MODE;   
  31.   
  32.         try {   
  33.             Cipher cipher = initCipher(mode);   
  34.   
  35.             byte[] outBytes = cipher.doFinal(value.getBytes());   
  36.   
  37.             s = String.valueOf(Hex.encodeHex(outBytes));   
  38.         } catch (Exception e) {   
  39.             e.printStackTrace();   
  40.         }   
  41.   
  42.         return s;   
  43.     }   
  44.   
  45.     /**  
  46.      * 解密  
  47.      * @param value  
  48.      * @return  
  49.      */  
  50.     public static String decrypt(String value) {   
  51.   
  52.         String s = null;   
  53.   
  54.         int mode = Cipher.DECRYPT_MODE;   
  55.   
  56.         try {   
  57.             Cipher cipher = initCipher(mode);   
  58.   
  59.             byte[] outBytes = cipher.doFinal(Hex.decodeHex(value.toCharArray()));   
  60.   
  61.             s = new String(outBytes);   
  62.         } catch (Exception e) {   
  63.             e.printStackTrace();   
  64.         }   
  65.   
  66.         return s;   
  67.     }   
  68.        
  69.     private static Cipher initCipher(int mode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException{   
  70.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");   
  71.         Key key = new SecretKeySpec(keybytes, "AES");   
  72.         cipher.init(mode, key);   
  73.         return cipher;   
  74.     }   
  75. }  

當然,你也可以使用自己寫的加密方法,或者是Java官方推薦的一些加密方法
調用SecUtil.encrypt的方法,把用戶密碼加密生成密文,然后根據密文修改hibernate.cfg.xml文件
Xml代碼
  1. <property name="connection.username">c59cd98</property>  
  2. <property name="connection.password">68e32593ea5943a6a</property>  
  3. <property name="connection.provider_class">com.CustomDriverManagerConnectionProvider</property>  


無名氏 2010-05-31 17:07 發表評論
]]>
hibernate 復合主鍵http://www.aygfsteel.com/hwpok/archive/2009/11/26/303749.html無名氏無名氏Thu, 26 Nov 2009 03:16:00 GMThttp://www.aygfsteel.com/hwpok/archive/2009/11/26/303749.htmlhttp://www.aygfsteel.com/hwpok/comments/303749.htmlhttp://www.aygfsteel.com/hwpok/archive/2009/11/26/303749.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/303749.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/303749.html

無名氏 2009-11-26 11:16 發表評論
]]>
Proxool 又一點http://www.aygfsteel.com/hwpok/archive/2008/11/27/243053.html無名氏無名氏Thu, 27 Nov 2008 10:15:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/11/27/243053.htmlhttp://www.aygfsteel.com/hwpok/comments/243053.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/11/27/243053.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/243053.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/243053.html至于為什么要用proxool連接池,這里就不細說了——總之,非常棒的一個連接池!

以下介紹proxool的部署和使用:

1、添加proxool-0.8.3.jar包。


2、把proxool-conf.xml放到src的根目錄。
具體內容如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored.
請不要隨意改動配置!
-->

<something-else-entirely>
<proxool>
<alias>pro_pool</alias>
<!--proxool只能管理由自己產生的連接-->
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver-url>jdbc:oracle:thin:@IP地址:數據庫實例名</driver-url>
<driver-properties>
    <property name="user" value="具體用戶名" />
  <property name="password" value="具體密碼" />
</driver-properties>
 


--><!-- proxool自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀-->
<house-keeping-sleep-time>60000</house-keeping-sleep-time>
<!-- 指因未有空閑連接可以分配而在隊列中等候的最大請求數,超過這個請求數的用戶連接就不會被接受-->
<maximum-new-connections>20</maximum-new-connections>
<!-- 線程最大壽命 -->
<maximum-connection-lifetime>1200000</maximum-connection-lifetime>
<!-- 最少保持的空閑連接數-->
<prototype-count>3</prototype-count>
<!-- 允許最大連接數,超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new-connections決定-->
<maximum-connection-count>40</maximum-connection-count>
<!-- 最小連接數-->
<minimum-connection-count>3</minimum-connection-count>
<house-keeping-test-sql>select CURRENT_DATE from dual</house-keeping-test-sql>
</proxool>
</something-else-entirely>


3、在web.xml中添加以下代碼,使得項目啟動時,自動加載proxool。
 <servlet>
  <servlet-name>AdminP</servlet-name>
  <servlet-class>
   org.logicalcobwebs.proxool.admin.servlet.AdminServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>AdminP</servlet-name>
  <url-pattern>/AdminP</url-pattern>
 </servlet-mapping>

 <servlet>
  <servlet-name>proxoolServletConfigurator</servlet-name>
  <servlet-class>
   org.logicalcobwebs.proxool.configuration.ServletConfigurator
  </servlet-class>
  <init-param>
   <param-name>xmlFile</param-name>
   <param-value>WEB-INF/classes/proxool-conf.xml</param-value>
  </init-param>
  <load-on-startup>5</load-on-startup>
 </servlet>


4、程序調用(三種方式)

     根據自己項目情況,采用以下三種方式中的任何一種即可。
1)、Spring框架調用。
在applicationContext.xml文件中:

 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  destroy-method="close" singleton="true">
  <property name="driverClassName">
   <value>org.logicalcobwebs.proxool.ProxoolDriver</value>
  </property>
  <property name="url">
   <value>proxool.pro_pool</value>
  </property>
 </bean>

 

2)、純JDBC調用

driver = (Driver)Class.forName("org.logicalcobwebs.proxool.ProxoolDriver").newInstance();
DriverManager.registerDriver(driver);
conn = DriverManager.getConnection("proxool.pro_pool");

 

3)、Hibernate調用

hibernate.cfg.xml中增加:
<property name="hibernate.proxool.pool_alias">pro_pool</property>
<property name="hibernate.proxool.xml">proxool-conf.xml</property>
<property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>

程序中使用

Connection con = DriverManager.getConnection("proxool.pro_pool");



無名氏 2008-11-27 18:15 發表評論
]]>
proxool 配法 實時監控 hibernatehttp://www.aygfsteel.com/hwpok/archive/2008/11/27/243022.html無名氏無名氏Thu, 27 Nov 2008 08:24:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/11/27/243022.htmlhttp://www.aygfsteel.com/hwpok/comments/243022.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/11/27/243022.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/243022.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/243022.html
<?xml version='1.0' encoding='gb2312'?>
<something-else-entirely>
    
<proxool>
        
<alias>MYPool</alias><!--連接池的別名-->
        
<driver-url>
            jdbc:oracle:thin:@127.0.0.1:1521:rwcm
        
</driver-url>
        
<!--JDBC驅動程序rdwk21_#-->
        
<driver-class>
            oracle.jdbc.driver.OracleDriver
        
</driver-class>
        
<driver-properties>
            
<property name="user" value="root" />
            
<property name="password" value="root" />
        
</driver-properties>
        
<!-- proxool自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀-->
        
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
        
<!-- 指因未有空閑連接可以分配而在隊列中等候的最大請求數,超過這個請求數的用戶連接就不會被接受-->
        
<maximum-new-connections>20</maximum-new-connections>
        
<!-- 最少保持的空閑連接數-->
        
<prototype-count>5</prototype-count>
        
<!-- 允許最大連接數,超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new-connections決定-->
        
<maximum-connection-count>100</maximum-connection-count>
        
<!-- 最小連接數-->
        
<minimum-connection-count>10</minimum-connection-count>
    
</proxool>
</something-else-entirely>
2.hibernate.cfg.xml
<session-factory>
        
<property name="hibernate.connection.provider_class">
            org.hibernate.connection.ProxoolConnectionProvider
        
</property>
        
<property name="hibernate.proxool.pool_alias">MYPool</property>
        
<property name="hibernate.proxool.xml">proxool.xml</property>
        
<property name="hibernate.connection.release_mode">
            auto
        
</property>
        
<property name="show_sql">false</property>
    
</session-factory>
3.web.xml
     <!-- 
        在應用中實時監控連接池開始
     
-->
     
<servlet> 
         
<servlet-name>Admin</servlet-name> 
         
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class> 
     
</servlet>
     
<servlet-mapping> 
         
<servlet-name>Admin</servlet-name> 
         
<url-pattern>/showProxoolSnapshot</url-pattern> 
     
</servlet-mapping>
     
<!--  
        在應用中實時監控連接池結束
     
-->




無名氏 2008-11-27 16:24 發表評論
]]>
HQL 總結http://www.aygfsteel.com/hwpok/archive/2008/11/12/240089.html無名氏無名氏Wed, 12 Nov 2008 06:23:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/11/12/240089.htmlhttp://www.aygfsteel.com/hwpok/comments/240089.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/11/12/240089.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/240089.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/240089.html 建表語句:
CREATE DATABASE `interceptor`
CHARACTER SET 'utf8';
USE `interceptor`;
DROP TABLE IF EXISTS `users`;

create table users(
id int auto_increment primary key,
name varchar(10) not null,
passwd varchar(10) not null
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
User.java:
package com.domain;
public class Users implements java.io.Serializable {
private Integer id;
private String name;
private String passwd;
public Users() {
}
public Users(String name, String passwd) {
this.name = name;
this.passwd = passwd;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return this.passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
User.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.domain.Users" table="users" catalog="interceptor">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="10" not-null="true" />
</property>
<property name="passwd" type="java.lang.String">
<column name="passwd" length="10" not-null="true" />
</property>
</class>
</hibernate-mapping>
1. 查詢整個映射對象所有字段
//直接from查詢出來的是一個映射對象,即:查詢整個映射對象所有字段

String hql = "from Users";
Query query = session.createQuery(hql);

List<Users> users = query.list();
for(Users user : users){
System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());
}

輸出結果為:
name1 : password1 : 1
name2 : password2 : 2
name3 : password3 : 3
2.查詢單個字段
//查詢單個字段

String hql = " select name from Users";
Query query = session.createQuery(hql);
List<String> list = query.list();
for(String str : list){
System.out.println(str);
}
輸出結果為:
name1
name2
name3
3.查詢其中幾個字段
//查詢其中幾個字段

String hql = " select name,passwd from Users";
Query query = session.createQuery(hql);
//默認查詢出來的list里存放的是一個Object數組
List<Object[]> list = query.list();
for(Object[] object : list){
String name = (String)object[0];
String passwd = (String)object[1];

System.out.println(name + " : " + passwd);
}

輸出結果為:
name1 : password1
name2 : password2
name3 : password3
4.修改默認查詢結果(query.list())不以Object[]數組形式返回,以List形式返回
//查詢其中幾個字段,添加new list(),注意list里的l是小寫的。也不需要導入包,這樣通過query.list()出來的list里存放的不再是默認的Object數組了,而是List集合了
String hql = " select new list(name,passwd) from Users";
Query query = session.createQuery(hql);
//默認查詢出來的list里存放的是一個Object數組,但是在這里list里存放的不再是默認的Object數組了,而是List集合了
List<List> list = query.list();
for(List user : list){

String name = (String)user.get(0);
String passwd = (String)user.get(1);

System.out.println(name + " : " + passwd);
}

/**

輸出結果為:
name1 : password1
name2 : password2
name3 : password3
*/
5.修改默認查詢結果(query.list())不以Object[]數組形式返回,以Map形式返回
//查詢其中幾個字段,添加new map(),注意map里的m是小寫的。也不需要導入包,這樣通過query.list()出來的list里存放的不再是默認的Object數組了,而是map集合了
String hql = " select new map(name,passwd) from Users";
Query query = session.createQuery(hql);
//默認查詢出來的list里存放的是一個Object數組,但是在這里list里存放的不再是默認的Object數組了,而是Map集合了

List<Map> list = query.list();
for(Map user : list){
//一條記錄里所有的字段值都是map里的一個元素,key是字符串0,1,2,3....,value是字段值
//如果將hql改為:String hql = " select new map(name as username,passwd as password) from Users";,那么key將不是字符串0,1,2...了,而是"username","password"了
String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字符串,而不是整形
String passwd = (String)user.get("1");
System.out.println(name + " : " + passwd);

}

/**
輸出結果為:
name1 : password1
name2 : password2
name3 : password3
*/
6.修改默認查詢結果(query.list())不以Object[]數組形式返回,以Set形式返回,但是因為Set里是不允許有重復的元素,所以:username和password的值不能相同。只需將hql改為:String hql = " select new set(name,passwd) from Users";
7.修改默認查詢結果(query.list())不以Object[]數組形式返回,以自定義類型返回
自定義類:
package com.domain;
public class MyUser {
private String username;
private String password;
//因為:String hql = " select new com.domain.MyUser(name,passwd) from Users";所以必須要有接受2個參數的構造函數
public MyUser(String username,String password){
this.username = username;
this.password = password;
}

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}


//通過query.list()出來的list里存放的不再是默認的Object數組了,而是自定義的類MyUser,必須加包名,String hql = "from Users";中的Users類也是必須加包名的,但是因為再Users.hbm.xml里<hibernate-mapping auto-import="true"> auto-import默認值為true(所以auto-import屬性也可以不寫),自動導入了
String hql = " select new com.domain.MyUser(name,passwd) from Users";
Query query = session.createQuery(hql);
//默認查詢出來的list里存放的是一個Object數組,但是在這里list里存放的不再是默認的Object數組了,而是MyUser對象了
List<MyUser> myUsers = query.list();
for(MyUser myUser : myUsers){
String name = myUser.getUsername();
String passwd = myUser.getPassword();
System.out.println(name + " : " + passwd);
}

/**

輸出結果為:
name1 : password1
name2 : password2
name3 : password3
*/



8:條件查詢
//條件查詢,參數索引值從0開始,索引位置。通過setString,setParameter設置參數
String hql = "from Users where name=? and passwd=?";
Query query = session.createQuery(hql);
//第1種方式
// query.setString(0, "name1");
// query.setString(1, "password1");
//第2種方式
query.setParameter(0, "name1",Hibernate.STRING);
query.setParameter(1, "password1",Hibernate.STRING);
List<Users> list = query.list();
for(Users users : list){
System.out.println(users.getId());
}
//條件查詢,自定義索引名(參數名):username,:password.通過setString,setParameter設置參數
String hql = "from Users where name=:username and passwd=:password";
Query query = session.createQuery(hql);
//第1種方式
// query.setString("username", "name1");
// query.setString("password", "password1");
//第2種方式,第3個參數確定類型
query.setParameter("username", "name1",Hibernate.STRING);
query.setParameter("password", "password1",Hibernate.STRING);
List<Users> list = query.list();
for(Users users : list){
out.println(users.getId());
}

//條件查詢,通過setProperties設置參數
String hql = "from Users where name=:username and passwd=:password";
Query query = session.createQuery(hql);
//MyUser類的2個屬性必須和:username和:password對應
MyUser myUser = new MyUser("name1","password1");
query.setProperties(myUser);
List<Users> list = query.list();
for(Users users : list){
System.out.println(users.getId());
}



無名氏 2008-11-12 14:23 發表評論
]]>
xdoclet2 例子http://www.aygfsteel.com/hwpok/archive/2008/10/20/235519.html無名氏無名氏Mon, 20 Oct 2008 11:21:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/10/20/235519.htmlhttp://www.aygfsteel.com/hwpok/comments/235519.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/10/20/235519.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/235519.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/235519.html
package org.roadway.wisp.test;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;

/**
 * @hibernate.class table="ZD_COSTOMER"
 
*/
public class Customer implements Serializable
{
    
private static final long serialVersionUID = 939548333216539319L;
    
    
private Long              customerId;
    
    
private String            customerName;
    
    
private Date              birthday;
    
    
private HashSet<Order>    orders;
    
    
/**
     * @hibernate.id generator-class="sequence" column="CUSTOMER_ID"
     *               unsaved-value = "null"
     * @hibernate.generator-param name="sequence" value="SQ_PERSON_ID"
     * 
     * 
@return
     
*/
    
public Long getCustomerId()
    {
        
return customerId;
    }
    
    
/**
     * @hibernate.property column="CUSTOMER_NAME" length="32" not-null="true"
     
*/
    
public String getCustomerName()
    {
        
return customerName;
    }
    
    
/**
     * @hibernate.property column="BIRTHDAY"
     
*/
    
public Date getBirthday()
    {
        
return birthday;
    }
    
    
/**
     * @hibernate.set table="ZD_ORDER" lazy="true" inverse="true"
     * @hibernate.key column="CUSTOMER_ID"
     * @hibernate.one-to-many class="org.roadway.wisp.test.Order"
     
*/
    
public HashSet<Order> getOrders()
    {
        
return orders;
    }
    
    
public void setCustomerId(Long customerId)
    {
        
this.customerId = customerId;
    }
    
    
public void setCustomerName(String customerName)
    {
        
this.customerName = customerName;
    }
    
    
public void setBirthday(Date birthday)
    {
        
this.birthday = birthday;
    }
    
    
public void setOrders(HashSet<Order> orders)
    {
        
this.orders = orders;
    }
}
Order.java
package org.roadway.wisp.test;

import java.io.Serializable;

/**
 * @hibernate.class table="ZD_ORDER"
 
*/
public class Order implements Serializable
{
    
private static final long serialVersionUID = 8989273619109202636L;
    
    
private Long              orderId;
    
    
private String            orderName;
    
    
private Double            money;
    
    
private Customer          customer;
    
    
/**
     * @hibernate.id generator-class="sequence" column="ORDER_ID" unsaved-value =
     *               "null"
     * @hibernate.generator-param name="sequence" value="SQ_ORDER_ID"
     * 
     * 
@return
     
*/
    
public Long getOrderId()
    {
        
return orderId;
    }
    
    
/**
     * @hibernate.property column="ORDER_NAME" length="32" not-null="true"
     
*/
    
public String getOrderName()
    {
        
return orderName;
    }
    
    
/**
     * @hibernate.property column="MONEY" not-null="true"
     
*/
    
public Double getMoney()
    {
        
return money;
    }
    
    
/**
     * @hibernate.many-to-one column="teacher_id" not-null="true"
     
*/
    
public Customer getCustomer()
    {
        
return customer;
    }
}
xdoclet.xml
<?xml version="1.0"?>
<project name="xdoclet" default="hibernate.mapping.generate" basedir=".">
    
<property name="project.src" value="test"/>
    
<property name="po.package" value="org/roadway/wisp/test"/>
    
<property name="xdoclet.lib" value="E:/user_hvp/xdoclet-plugins-dist-1.0.4/lib"/>
    
<path id="xdoclet.task.classpath">
        
<fileset dir="${xdoclet.lib}">
            
<include name="*.jar" />
        
</fileset>
        
<pathelement location="${xdoclet.lib}/xdoclet-plugin-hibernate-1.0.4.jar" />
    
</path>
    
<taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.task.classpath" />
    
<target name="hibernate.mapping.generate">
        
<xdoclet>
            
<fileset dir="${project.src}">
                
<include name="${po.package}/*.java" />
            
</fileset>
            
<component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" destdir="${basedir}/${project.src}" version="3.0" />
        
</xdoclet>
    
</target>
</project>
xdoclet1.x不支持泛型,xdoclet2支持!!


無名氏 2008-10-20 19:21 發表評論
]]>
請教xdoclet高手http://www.aygfsteel.com/hwpok/archive/2008/10/20/235444.html無名氏無名氏Mon, 20 Oct 2008 05:50:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/10/20/235444.htmlhttp://www.aygfsteel.com/hwpok/comments/235444.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/10/20/235444.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/235444.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/235444.html<?xml version="1.0" encoding="UTF-8"?>
<project name="xdoclet-hibernate-zfv" default="init" basedir=".">
    
<property name="project.src" value="./src" />
    
<property name="project.lib" value="D:/workspace/xcomr/web/WEB-INF/lib" />
    
<property name="pojo.package" value="org/roadway/wisp/zd/po" />
    
<property name="xdoclet.root" value="E:/user_hvp" />
    
<property name="xdoclet.lib" value="${xdoclet.root}/xdoclet-1.2.3" />
    
<property name="endtags" value="@xdoclet-generated at ${TODAY}" />
    
<path id="classpath">
        
<fileset dir="${xdoclet.lib}">
            
<include name="*.jar" />
        
</fileset>
        
<fileset dir="${project.lib}">
            
<include name="*.jar" />
        
</fileset>
    
</path>
    
<target name="init">
        
<taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="classpath" />
    
</target>
    
<target name="generate-mapping" depends="init">
        
<hibernatedoclet destdir="${project.src}" excludedtags="@version,@author,@todo,@see" addedtags="${endtags}" force="false" verbose="true">
            
<fileset dir="${project.src}">
                
<include name="${pojo.package}/Person.java" />
            
</fileset>
            
<hibernate version="3.0" xmlencoding="gb2312" />
        
</hibernatedoclet>
    
</target>
    
<target name="generate-schema-mysql" depends="init">
        
<taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="classpath" />
        
<taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="classpath" />
        
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
        
<property name="hibernate.format_sql" value="true" />
        
<property name="hibernate.use_sql_comments" value="true" />
        
<schemaexport quiet="no" text="yes" drop="no" delimiter=";" output="${project.src}/${pojo.package}/table-mysql-schema.sql">
            
<fileset dir="${project.src}">
                
<include name="${pojo.package}/*.hbm.xml" />
            
</fileset>
        
</schemaexport>
    
</target>
</project>
問題:上面的generate-mappin和generate-schema-mysql單獨運行,能正確生成文件,但depends="init"之后,不能生成文件.請高手指教.


無名氏 2008-10-20 13:50 發表評論
]]>
多一點jpahttp://www.aygfsteel.com/hwpok/archive/2008/09/27/231524.html無名氏無名氏Sat, 27 Sep 2008 08:08:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/09/27/231524.htmlhttp://www.aygfsteel.com/hwpok/comments/231524.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/09/27/231524.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/231524.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/231524.htmlTable
Table用來定義entity主表的name,catalog,schema等屬性。
元數據屬性說明:
name: 表名
catalog: 對應關系數據庫中的catalog
schema:對應關系數據庫中的schema
UniqueConstraints:定義一個UniqueConstraint數組,指定需要建唯一約束的列    
    @Entity
    @Table(name="CUST")
    public class Customer { ... }
  SecondaryTable
一個entity class可以映射到多表,SecondaryTable用來定義單個從表的名字,主鍵名字等屬性。
元數據屬性說明:
name: 表名
catalog: 對應關系數據庫中的catalog
schema:對應關系數據庫中的schema
pkJoin: 定義一個PrimaryKeyJoinColumn數組,指定從表的主鍵列
UniqueConstraints:定義一個UniqueConstraint數組,指定需要建唯一約束的列
下面的代碼說明Customer類映射到兩個表,主表名是CUSTOMER,從表名是CUST_DETAIL,從表的主鍵列和主表的主鍵列類型相同,列名為CUST_ID。              
    @Entity
    @Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))
public class Customer { ... }
    SecondaryTables
當一個entity class映射到一個主表和多個從表時,用SecondaryTables來定義各個從表的屬性。
元數據屬性說明:
value: 定義一個SecondaryTable數組,指定每個從表的屬性。                
@Table(name = "CUSTOMER")
@SecondaryTables( value = {
@SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),
@SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })
public class Customer {}  
    UniqueConstraint
UniqueConstraint定義在Table或SecondaryTable元數據里,用來指定建表時需要建唯一約束的列。
元數據屬性說明:
columnNames:定義一個字符串數組,指定要建唯一約束的列名。                
  @Entity
  @Table(name="EMPLOYEE",
   uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}
  )
  public class Employee { ... }  
   Column
Column元數據定義了映射到數據庫的列的所有屬性:列名,是否唯一,是否允許為空,是否允許更新等。
元數據屬性說明:
name:列名。
unique: 是否唯一
nullable: 是否允許為空
insertable: 是否允許插入
updatable: 是否允許更新
columnDefinition: 定義建表時創建此列的DDL
secondaryTable: 從表名。如果此列不建在主表上(默認建在主表),該屬性定義該列所在從表的名字。       
    public class Person {
@Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)
private String name;
@Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")
private byte[] picture;
    JoinColumn
如果在entity class的field上定義了關系(one2one或one2many等),我們通過JoinColumn來定義關系的屬性。JoinColumn的大部分屬性和Column類似。
元數據屬性說明:
name:列名。
referencedColumnName:該列指向列的列名(建表時該列作為外鍵列指向關系另一端的指定列)
unique: 是否唯一
nullable: 是否允許為空
insertable: 是否允許插入
updatable: 是否允許更新
columnDefinition: 定義建表時創建此列的DDL
secondaryTable: 從表名。如果此列不建在主表上(默認建在主表),該屬性定義該列所在從表的名字。
下面的代碼說明Custom和Order是一對一關系。在Order對應的映射表建一個名為CUST_ID的列,該列作為外鍵指向Custom對應表中名為ID的列。              
public class Custom {
    @OneToOne
@JoinColumn(
name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)
public Order getOrder() {
  return order;
}  
    JoinColumns
如果在entity class的field上定義了關系(one2one或one2many等),并且關系存在多個JoinColumn,用JoinColumns定義多個JoinColumn的屬性。
元數據屬性說明:
value: 定義JoinColumn數組,指定每個JoinColumn的屬性。
下面的代碼說明Custom和Order是一對一關系。在Order對應的映射表建兩列,一列名為CUST_ID,該列作為外鍵指向Custom對應表中名為ID的列,另一列名為CUST_NAME,該列作為外鍵指向Custom對應表中名為NAME的列。             
public class Custom {
    @OneToOne
@JoinColumns({
    @JoinColumn(name="CUST_ID", referencedColumnName="ID"),
    @JoinColumn(name="CUST_NAME", referencedColumnName="NAME")
})
public Order getOrder() {
  return order;
}  
    Id
聲明當前field為映射表中的主鍵列。id值的獲取方式有五種:TABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracle和DB2支持SEQUENCE,SQL Server和Sybase支持IDENTITY,mysql支持AUTO。所有的數據庫都可以指定為AUTO,我們會根據不同數據庫做轉換。NONE(默認)需要用戶自己指定Id的值。元數據屬性說明:
generate():主鍵值的獲取類型
generator():TableGenerator的名字(當generate=GeneratorType.TABLE才需要指定該屬性)
下面的代碼聲明Task的主鍵列id是自動增長的。(Oracle和DB2從默認的SEQUENCE取值,SQL Server和Sybase該列建成IDENTITY,mysql該列建成auto increment。)                
    @Entity
    @Table(name = "OTASK")
    public class Task {
   @Id(generate = GeneratorType.AUTO)
   public Integer getId() {
    return id;
   }
    }  
    IdClass
當entity class使用復合主鍵時,需要定義一個類作為id class。id class必須符合以下要求:類必須聲明為public,并提供一個聲明為public的空構造函數。必須實現Serializable接,覆寫equals()和hashCode()方法。entity class的所有id field在id class都要定義,且類型一樣。
元數據屬性說明:
value: id class的類名                
    public class EmployeePK implements java.io.Serializable{
       String empName;
       Integer empAge;
    public EmployeePK(){}
    public boolean equals(Object obj){ ......}
    public int hashCode(){......}
    }

    @IdClass(value=com.acme.EmployeePK.class)
    @Entity(access=FIELD)
    public class Employee {
        @Id String empName;
        @Id Integer empAge;
    }  
    MapKey
在一對多,多對多關系中,我們可以用Map來保存集合對象。默認用主鍵值做key,如果使用復合主鍵,則用id class的實例做key,如果指定了name屬性,就用指定的field的值做key。
元數據屬性說明:
name: 用來做key的field名字
下面的代碼說明Person和Book之間是一對多關系。Person的books字段是Map類型,用Book的isbn字段的值作為Map的key。
               
    @Table(name = "PERSON")
    public class Person {
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@MapKey(name = "isbn")
private Map books = new HashMap();
    }
   
    OrderBy
在一對多,多對多關系中,有時我們希望從數據庫加載出來的集合對象是按一定方式排序的,這可以通過OrderBy來實現,默認是按對象的主鍵升序排列。
元數據屬性說明:
value: 字符串類型,指定排序方式。格式為"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序類型可以不指定,默認是ASC。
下面的代碼說明Person和Book之間是一對多關系。集合books按照Book的isbn升序,name降序排列。
               
    @Table(name = "MAPKEY_PERSON")
    public class Person {
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@OrderBy(name = "isbn ASC, name DESC")
private List books = new ArrayList();
    }  
    PrimaryKeyJoinColumn
在三種情況下會用到PrimaryKeyJoinColumn。
繼承。
entity class映射到一個或多個從表。從表根據主表的主鍵列(列名為referencedColumnName值的列),建立一個類型一樣的主鍵列,列名由name屬性定義。
one2one關系,關系維護端的主鍵作為外鍵指向關系被維護端的主鍵,不再新建一個外鍵列。
元數據屬性說明:
name:列名。
referencedColumnName:該列引用列的列名
columnDefinition: 定義建表時創建此列的DDL
下面的代碼說明Customer映射到兩個表,主表CUSTOMER,從表CUST_DETAIL,從表需要建立主鍵列CUST_ID,該列和主表的主鍵列id除了列名不同,其他定義一樣。           
    @Entity
    @Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID",referencedColumnName="id"))
public class Customer {
  @Id(generate = GeneratorType.AUTO)
   public Integer getId() {
    return id;
   }
}  
    下面的代碼說明Employee和EmployeeInfo是一對一關系,Employee的主鍵列id作為外鍵指向EmployeeInfo的主鍵列INFO_ID。          
    @Table(name = "Employee")
    public class Employee {
@OneToOne
@PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")
EmployeeInfo info;
}  
    PrimaryKeyJoinColumns
如果entity class使用了復合主鍵,指定單個PrimaryKeyJoinColumn不能滿足要求時,可以用PrimaryKeyJoinColumns來定義多個PrimaryKeyJoinColumn。
元數據屬性說明:
value: 一個PrimaryKeyJoinColumn數組,包含所有PrimaryKeyJoinColumn。
下面的代碼說明了Employee和EmployeeInfo是一對一關系。他們都使用復合主鍵,建表時需要在Employee表建立一個外鍵,從Employee的主鍵列id,name指向EmployeeInfo的主鍵列INFO_ID和INFO_NAME.           
   @Entity
   @IdClass(EmpPK.class)
   @Table(name = "EMPLOYEE")
   public class Employee {
private int id;
private String name;
private String address;
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),
@PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})
EmployeeInfo info;
    }
    @Entity
    @IdClass(EmpPK.class)
    @Table(name = "EMPLOYEE_INFO")
    public class EmployeeInfo {
@Id
@Column(name = "INFO_ID")
private int id;
@Id
@Column(name = "INFO_NAME")
private String name;
}  
    Transient
Transient用來注釋entity的屬性,指定的這些屬性不會被持久化,也不會為這些屬性建表。
   
    @Transient
    private String name;     
Version
Version指定實體類在樂觀事務中的version屬性。在實體類重新由EntityManager管理并且加入到樂觀事務中時,保證完整性。每一個類只能有一個屬性被指定為version,version屬性應該映射到實體類的主表上。
下面的代碼說明versionNum屬性作為這個類的version,映射到數據庫中主表的列名是OPTLOCK。              
    @Version
    @Column("OPTLOCK")
    protected int getVersionNum() { return versionNum  
    Lob
Lob指定一個屬性作為數據庫支持的大對象類型在數據庫中存儲。使用LobType這個枚舉來定義Lob是二進制類型還是字符類型。
LobType枚舉類型說明:
BLOB 二進制大對象,Byte[]或者Serializable的類型可以指定為BLOB。
CLOB 字符型大對象,char[]、Character[]或String類型可以指定為CLOB。
元數據屬性說明:
fetch: 定義這個字段是lazy loaded還是eagerly fetched。數據類型是FetchType枚舉,默認為LAZY,即lazy loaded.
type: 定義這個字段在數據庫中的JDBC數據類型。數據類型是LobType枚舉,默認為BLOB。
下面的代碼定義了一個BLOB類型的屬性和一個CLOB類型的屬性。              
    @Lob
    @Column(name="PHOTO" columnDefinition="BLOB NOT NULL")
    protected JPEGImage picture;    
    @Lob(fetch=EAGER, type=CLOB)
    @Column(name="REPORT")
    protected String report;  
    JoinTable
JoinTable在many-to-many關系的所有者一邊定義。如果沒有定義JoinTable,使用JoinTable的默認值。
元數據屬性說明:
table:這個join table的Table定義。
joinColumns:定義指向所有者主表的外鍵列,數據類型是JoinColumn數組。
inverseJoinColumns:定義指向非所有者主表的外鍵列,數據類型是JoinColumn數組。
下面的代碼定義了一個連接表CUST和PHONE的join table。join table的表名是CUST_PHONE,包含兩個外鍵,一個外鍵是CUST_ID,指向表CUST的主鍵ID,另一個外鍵是PHONE_ID,指向表PHONE的主鍵ID。              
    @JoinTable(
    table=@Table(name=CUST_PHONE),
    joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
    inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
    )  
    TableGenerator
TableGenerator定義一個主鍵值生成器,在Id這個元數據的generate=TABLE時,generator屬性中可以使用生成器的名字。生成器可以在類、方法或者屬性上定義。
生成器是為多個實體類提供連續的ID值的表,每一行為一個類提供ID值,ID值通常是整數。
元數據屬性說明:
name:生成器的唯一名字,可以被Id元數據使用。
table:生成器用來存儲id值的Table定義。
pkColumnName:生成器表的主鍵名稱。
valueColumnName:生成器表的ID值的列名稱。
pkColumnValue:生成器表中的一行數據的主鍵值。
initialValue:id值的初始值。
allocationSize:id值的增量。
下面的代碼定義了兩個生成器empGen和addressGen,生成器的表是ID_GEN。                
    @Entity public class Employee {
    ...
    @TableGenerator(name="empGen",
    table=@Table(name="ID_GEN"),
    pkColumnName="GEN_KEY",
    valueColumnName="GEN_VALUE",
    pkColumnValue="EMP_ID",
    allocationSize=1)
    @Id(generate=TABLE, generator="empGen")
    public int id;
    ...
    }  
    @Entity public class Address {
    ...
    @TableGenerator(name="addressGen",
    table=@Table(name="ID_GEN"),
    pkColumnValue="ADDR_ID")
    @Id(generate=TABLE, generator="addressGen")
    public int id;
    ...
    }  
    SequenceGenerator
SequenceGenerator定義一個主鍵值生成器,在Id這個元數據的generator屬性中可以使用生成器的名字。生成器可以在類、方法或者屬性上定義。生成器是數據庫支持的sequence對象。
元數據屬性說明:
name:生成器的唯一名字,可以被Id元數據使用。
sequenceName:數據庫中,sequence對象的名稱。如果不指定,會使用提供商指定的默認名稱。
initialValue:id值的初始值。
allocationSize:id值的增量。
下面的代碼定義了一個使用提供商默認名稱的sequence生成器。             
    @SequenceGenerator(name="EMP_SEQ", allocationSize=25)    
    DiscriminatorColumn
DiscriminatorColumn定義在使用SINGLE_TABLE或JOINED繼承策略的表中區別不繼承層次的列。
元數據屬性說明:
name:column的名字。默認值為TYPE。
columnDefinition:生成DDL的sql片斷。
length:String類型的column的長度,其他類型使用默認值10。
下面的代碼定義了一個列名為DISC,長度為20的String類型的區別列。              
    @Entity
    @Table(name="CUST")
    @Inheritance(strategy=SINGLE_TABLE,
        discriminatorType=STRING,
       discriminatorValue="CUSTOMER")
    @DiscriminatorColumn(name="DISC", length=20)
    public class Customer { ... }



無名氏 2008-09-27 16:08 發表評論
]]>
一小點jpa http://www.aygfsteel.com/hwpok/archive/2008/09/26/231275.html無名氏無名氏Fri, 26 Sep 2008 04:50:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/09/26/231275.htmlhttp://www.aygfsteel.com/hwpok/comments/231275.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/09/26/231275.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/231275.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/231275.htmlpackage org.test;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@SuppressWarnings(
"serial")
@Entity
@Table(name 
= "t_student")
public class Student implements Serializable
{
    @Id
    @GeneratedValue(strategy 
= GenerationType.SEQUENCE, generator = "TRAIN_SEQ")
    @SequenceGenerator(name 
= "TRAIN_SEQ", sequenceName = "seq_student_id", allocationSize = 1)
    @Column(name 
= "student_id")
    Long   studentId;
    
    @Column(name 
= "student_name")
    String studentName;
    
    
public Long getStudentId()
    
{
        
return studentId;
    }

    
    
public void setStudentId(Long studentId)
    
{
        
this.studentId = studentId;
    }

    
    
public String getStudentName()
    
{
        
return studentName;
    }

    
    
public void setStudentName(String studentName)
    
{
        
this.studentName = studentName;
    }

}



無名氏 2008-09-26 12:50 發表評論
]]>
Hibernate 屬性一覽表http://www.aygfsteel.com/hwpok/archive/2008/08/13/221833.html無名氏無名氏Wed, 13 Aug 2008 14:22:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/08/13/221833.htmlhttp://www.aygfsteel.com/hwpok/comments/221833.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/08/13/221833.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/221833.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/221833.html 屬性名 用途 hibernate.dialect 一個Hibernate Dialect類名允許Hibernate針對特定的關系數據庫生成優化的SQL. 取值 full.classname.of.Dialect hibernate.show_sql 輸出所有SQL語句到控制臺. 有一個另外的選擇是把org.hibernate.SQL這個log category設為debugeg. true | false hibernate.format_sql 在log和console中打印出更漂亮的SQL。 取值 true | false hibernate.default_schema 在生成的SQL中, 將給定的schema/tablespace附加于非全限定名的表名上. 取值 SCHEMA_NAME hibernate.default_catalog 在生成的SQL中, 將給定的catalog附加于非全限定名的表名上. 取值 CATALOG_NAME hibernate.session_factory_name SessionFactory創建后,將自動使用這個名字綁定到JNDI中. 取值 jndi/composite/name hibernate.max_fetch_depth 為單向關聯(一對一, 多對一)的外連接抓取(outer join fetch)樹設置最大深度. 值為0意味著將關閉默認的外連接抓取. 取值 建議在03之間取值 hibernate.default_batch_fetch_size 為Hibernate關聯的批量抓取設置默認數量. 取值 建議的取值為4, 8, 和16 hibernate.default_entity_mode 為由這個SessionFactory打開的所有Session指定默認的實體表現模式. 取值 dynamic-map, dom4j, pojo hibernate.order_updates 強制Hibernate按照被更新數據的主鍵,為SQL更新排序。這么做將減少在高并發系統中事務的死鎖。 取值 true | false hibernate.generate_statistics 如果開啟, Hibernate將收集有助于性能調節的統計數據. 取值 true | false hibernate.use_identifer_rollback 如果開啟, 在對象被刪除時生成的標識屬性將被重設為默認值. 取值 true | false hibernate.use_sql_comments 如果開啟, Hibernate將在SQL中生成有助于調試的注釋信息, 默認值為false. 取值 true | false

無名氏 2008-08-13 22:22 發表評論
]]>
ThreadLocal 使用方法http://www.aygfsteel.com/hwpok/archive/2008/08/02/219643.html無名氏無名氏Sat, 02 Aug 2008 15:26:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/08/02/219643.htmlhttp://www.aygfsteel.com/hwpok/comments/219643.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/08/02/219643.html#Feedback0http://www.aygfsteel.com/hwpok/comments/commentRss/219643.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/219643.htmlpublic class Sequence {
 private static ThreadLocal<Integer> localVar = new ThreadLocal<Integer>() {
  public Integer initialValue() {
   return 0;
  }
 };

 public int getNextVal() {
  localVar.set(localVar.get() + 1);
  return localVar.get();
 }

 public static void main(String[] args) {
  Sequence seq = new Sequence();
  Client client1 = new Client(seq);
  Client client2 = new Client(seq);
  Client client3 = new Client(seq);

  client1.start();
  client2.start();
  client3.start();

 }

}


package hvp.spring.transaction.threadLocal;

public class Client extends Thread{
 private Sequence seq;
 public Client(Sequence seq){
  this.seq = seq;
 }
 public void run(){
  StringBuffer sb = new StringBuffer();
  for(int i=0;i<5;i++){
   sb.append("Thread[");
   sb.append(Thread.currentThread().getName());
   sb.append("] seq[");
   sb.append(seq.getNextVal());
   sb.append("]");
   System.out.println(sb.toString());
   sb.delete(0, sb.length());
  }
 }
}




無名氏 2008-08-02 23:26 發表評論
]]>
Hibernate 的 jar 包說明http://www.aygfsteel.com/hwpok/archive/2008/07/26/217651.html無名氏無名氏Sat, 26 Jul 2008 05:53:00 GMThttp://www.aygfsteel.com/hwpok/archive/2008/07/26/217651.htmlhttp://www.aygfsteel.com/hwpok/comments/217651.htmlhttp://www.aygfsteel.com/hwpok/archive/2008/07/26/217651.html#Feedback1http://www.aygfsteel.com/hwpok/comments/commentRss/217651.htmlhttp://www.aygfsteel.com/hwpok/services/trackbacks/217651.html

主要介紹的是Hibernate使用到的.jar
Hibernate一共包括了23個jar包,令人眼花繚亂。本文將詳細講解Hibernate每個jar包的作用,便于你在應用中根據自己的需要進行取舍。
下載Hibernate,例如2.0.3穩定版本,解壓縮,可以看到一個hibernate2.jar和lib目錄下有22個jar包.

1.hibernate2: jar
    Hibernate的庫,沒有什么可說的,必須使用的jar包.

2.cglib-asm.jar
    CGLIB庫,Hibernate用它來實現PO字節碼的動態生成,非常核心的庫,必須使用的jar包.

3.dom4j.jar
    dom4j是一個Java的XML API,類似于jdom,用來讀寫XML文件的。dom4j是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,對主流的Java XML API進行的性能、功能和易用性的評測,dom4j無論在那個方面都是非常出色的。我早在將近兩年之前就開始使用dom4j,直到現在。如今你可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar包,Hibernate用它來讀寫配置文件。

4.odmg.jar
    ODMG是一個ORM的規范,Hibernate實現了ODMG規范,這是一個核心的庫,必須使用的jar包。

5.commons-collections.jar
    Apache Commons包中的一個,包含了一些Apache開發的集合類,功能比java.util.*強大。必須使用的jar包。

6.commons-beanutils.jar
    Apache Commons包中的一個,包含了一些Bean工具類類。必須使用的jar包。

7.commons-lang.jar
    Apache Commons包中的一個,包含了一些數據類型工具類,是java.lang.*的擴展。必須使用的jar包。

8.commons-logging.jar:
    Apache Commons包中的一個,包含了日志功能,必須使用的jar包。這個包本身包含了一個Simple Logger,但是功能很弱。在運行的時候它會先在CLASSPATH找log4j,如果有,就使用log4j,如果沒有,就找JDK1.4帶的java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出現是一個歷史的的遺留的遺憾,當初Apache極力游說Sun把log4j加入JDK1.4,然而JDK1.4項目小組已經接近發布JDK1.4產品的時間了,因此拒絕了Apache的要求,使用自己的java.util.logging,這個包的功能比log4j差的很遠,性能也一般。后來Apache就開發出來了commons-logging.jar用來兼容兩個logger。因此用commons-logging.jar寫的log程序,底層的Logger是可以切換的,你可以選擇log4j,java.util.logging或者它自帶的Simple Logger。不過我仍然強烈建議使用log4j,因為log4j性能很高,log輸出信息時間幾乎等于System.out,而處理一條log平均只需要5us。你可以在Hibernate的src目錄下找到Hibernate已經為你準備好了的log4j的配置文件,你只需要到Apache 網站去下載log4j就可以了。commons-logging.jar也是必須的jar包。

-----------------------------------------------------------------------------------------
使用Hibernate必須的jar包就是以上的這幾個,剩下的都是可選的。
-----------------------------------------------------------------------------------------

9.ant.jar
    Ant編譯工具的jar包,用來編譯Hibernate源代碼的。如果你不準備修改和編譯Hibernate源代碼,那么就沒有什么用,可選的jar包

10.optional.jar
    Ant的一個輔助包。

11.c3p0.jar
    C3PO是一個數據庫連接池,Hibernate可以配置為使用C3PO連接池。如果你準備用這個連接池,就需要這個jar包。

12.proxool.jar
    也是一個連接池,同上。

13.commons-pool.jar,commons-dbcp.jar
    DBCP數據庫連接池,Apache的Jakarta組織開發的,Tomcat4的連接池也是DBCP。

    實際上Hibernate自己也實現了一個非常非常簡單的數據庫連接池,加上上面3個,你實際上可以在Hibernate上選擇4種不同的數據庫連接池,選擇哪一個看個人的偏好,不過DBCP可能更通用一些。另外強調一點,如果在EJB中使用Hibernate,一定要用App Server的連接池,不要用以上4種連接池,否則容器管理事務不起作用。

14.connector.jar
    JCA 規范,如果你在App Server上把Hibernate配置為Connector的話,就需要這個jar。不過實際上一般App Server肯定會帶上這個包,所以實際上是多余的包。

15.jaas.jar
    JAAS是用來進行權限驗證的,已經包含在JDK1.4里面了。所以實際上是多余的包。

16.jcs.jar
    如果你準備在Hibernate中使用JCS的話,那么必須包括它,否則就不用。

17.jdbc2_0-stdext.jar
    JDBC2.0的擴展包,一般來說數據庫連接池會用上它。不過App Server都會帶上,所以也是多余的。

18.jta.jar
    JTA規范,當Hibernate使用JTA的時候需要,不過App Server都會帶上,所以也是多余的。

19.junit.jar
    Junit包,當你運行Hibernate自帶的測試代碼的時候需要,否則就不用。

20.xalan.jar, xerces.jar, xml-apis.jar
    Xerces是XML解析器,Xalan是格式化器,xml-apis實際上是JAXP。一般App Server都會帶上,JDK1.4也包含了解析器,不過不是Xerces,是Crimson,效率比較差,不過Hibernate用XML只不過是讀取配置文件,性能沒什么緊要的,所以也是多余的。



無名氏 2008-07-26 13:53 發表評論
]]>
主站蜘蛛池模板: 武川县| 南投县| 岳池县| 元朗区| 镇宁| 甘谷县| 乳山市| 噶尔县| 五大连池市| 怀化市| 股票| 北宁市| 元谋县| 盐山县| 辽阳市| 商城县| 昂仁县| 中卫市| 区。| 安吉县| 启东市| 金湖县| 阿拉善右旗| 伊春市| 民权县| 绥化市| 鹿泉市| 息烽县| 黔江区| 大冶市| 吴桥县| 三亚市| 丹东市| 中江县| 乾安县| 衡南县| 高陵县| 高碑店市| 耒阳市| 墨竹工卡县| 南昌县|