package com.frameworkset.common.hibernate; import java.io.Serializable; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import net.sf.hibernate.HibernateException; import net.sf.hibernate.MappingException; import net.sf.hibernate.cfg.Configuration; import net.sf.hibernate.cfg.Environment; import org.apache.log4j.Logger; import com.frameworkset.common.poolman.sql.PoolManDataSource; import com.frameworkset.common.poolman.sql.PrimaryKeyCacheManager; import com.frameworkset.util.NoSupportTypeCastException; import com.frameworkset.util.ValueObjectUtil; /** * <p>Title: KeyGenerator</p> * * <p>Description: 主键生成器</p> * * <p> * bboss workgroup * </p> * <p> * Copyright (c) 2007 * </p> * * @Date 2009-6-1 下午08:58:51 * @author biaoping.yin * @version 1.0 */ public class KeyGenerator // implements IdentifierGenerator, Configurable,net.sf.hibernate.id.IdentifierGenerator,net.sf.hibernate.id.Configurable { implements Serializable,net.sf.hibernate.id.IdentifierGenerator,net.sf.hibernate.id.Configurable { private static Configuration config = null; private static Logger log = Logger.getLogger(KeyGenerator.class); private String tableName; private String poolName; private String typeClass; private net.sf.hibernate.type.Type type; DataSource ds; public KeyGenerator() { } public static void init(Configuration configs) { if(config == null) config = configs; } // public void configure(Type type, Properties properties, Dialect dialect) throws MappingException { // tableName = properties.getProperty("tableName"); // if(tableName == null) // { // String msg = "tableName was not specified by property tableName" ; // log.fatal(msg); // throw new HibernateException(msg); // } // poolName = properties.getProperty("poolName"); // String jndiName = Environment.getProperties().getProperty("connection.datasource"); // if (jndiName==null) { // String msg = "datasource JNDI name was not specified by property " + Environment.DATASOURCE; // log.fatal(msg); // return; // //throw new HibernateException(msg); // } // // String user = Environment.getProperties().getProperty(Environment.USER); // String pass = Environment.getProperties().getProperty(Environment.PASS); // // try { // ds = (DataSource)NamingHelper.getInitialContext(Environment.getProperties()).lookup("connection.datasource"); // // } // catch (Exception e) { // log.fatal( "Could not find datasource: " + jndiName, e ); // return; // //throw new HibernateException( "Could not find datasource", e ); // } // //if (ds==null) throw new HibernateException( "Could not find datasource: " + jndiName ); // if (ds==null) // { // log.info("Could not find datasource: " + jndiName); // return; // } // log.info( "Using datasource: " + jndiName ); // // } // // public Serializable generate(SessionImplementor sessionImplementor, Object object) throws HibernateException { // // if (ds != null && ds instanceof PoolManDataSource) // try{ // return ((PoolManDataSource) ds).getPrimaryKey(tableName); // } // // catch (SQLException ex) { // log.error("generate primarykey for table[" // + ((PoolManDataSource) ds) // + ":" // + tableName // + "] error:" // + ex.getMessage()); // throw new HibernateException("generate primarykey for table[" // + ((PoolManDataSource) ds).getJNDIName() // + ":" // + tableName // + "] error:" // + ex.getMessage() // ); // } // else // { // if(poolName == null) // { // String msg = "poolName was not specified by property poolName,please check your hibernate mapping file"; // log.fatal(msg); // throw new HibernateException(msg); // } // try // { // return getPrimaryKey(poolName, tableName); // } // catch(SQLException e) // { // String msg = "getPrimaryKey for poolName[" + poolName + "] tableName [" + tableName + "] error:" + e.getMessage(); // log.fatal(msg); // throw new HibernateException(msg); // // } // } // // // } public Serializable getPrimaryKey(String poolName,String tableName,Connection con) throws SQLException { // Long key = new Long(PrimaryKeyCacheManager.getInstance() // .getPrimaryKeyCache(poolName) // .getIDTable(tableName.toLowerCase()).generateKey()); return PrimaryKeyCacheManager.getInstance() .getPrimaryKeyCache(poolName) .getIDTable(tableName.toLowerCase()).generateObjectKey(con).getPrimaryKey(); } /* (non-Javadoc) * @see net.sf.hibernate.id.IdentifierGenerator#generate(net.sf.hibernate.engine.SessionImplementor, java.lang.Object) */ public Serializable generate(net.sf.hibernate.engine.SessionImplementor arg0, Object arg1) throws SQLException, net.sf.hibernate.HibernateException { if (ds != null && ds instanceof PoolManDataSource) try{ Serializable primaryKey = ((PoolManDataSource) ds).getPrimaryKey(tableName,arg0.connection()); if(primaryKey.getClass().getName().equals(this.typeClass)) return primaryKey; else { return (Serializable)ValueObjectUtil.basicTypeCast(primaryKey,primaryKey.getClass(),type.getReturnedClass()); } } catch (SQLException ex) { log.error("generate primarykey for table[" + ((PoolManDataSource) ds) + ":" + tableName + "] error:" + ex.getMessage()); throw new HibernateException("generate primarykey for table[" + ((PoolManDataSource) ds).getJNDIName() + ":" + tableName + "] error:" + ex.getMessage() ); } catch (NumberFormatException e) { throw new HibernateException("generate primarykey for table[" + ((PoolManDataSource) ds).getJNDIName() + ":" + tableName + "] error:" + e.getMessage()); } catch (NoSupportTypeCastException e) { throw new HibernateException("generate primarykey for table[" + ((PoolManDataSource) ds).getJNDIName() + ":" + tableName + "] error:" + e.getMessage()); } else { if(poolName == null) { String msg = "poolName was not specified by property poolName,please check your hibernate mapping file"; log.fatal(msg); throw new HibernateException(msg); } try { Serializable primaryKey = getPrimaryKey(poolName, tableName,arg0.connection()); if(primaryKey.getClass().getName().equals(this.typeClass)) return primaryKey; else { return (Serializable)ValueObjectUtil.basicTypeCast(primaryKey,primaryKey.getClass(),type.getReturnedClass()); } } catch(SQLException e) { String msg = "getPrimaryKey for poolName[" + poolName + "] tableName [" + tableName + "] error:" + e.getMessage(); log.fatal(msg); throw new HibernateException(msg); } catch (NumberFormatException e) { // TODO Auto-generated catch block String msg = "getPrimaryKey for poolName[" + poolName + "] tableName [" + tableName + "] error:" + e.getMessage(); log.fatal(msg); throw new HibernateException(msg); } catch (NoSupportTypeCastException e) { String msg = "getPrimaryKey for poolName[" + poolName + "] tableName [" + tableName + "] error:" + e.getMessage(); log.fatal(msg); throw new HibernateException(msg); } } } /* (non-Javadoc) * @see net.sf.hibernate.id.Configurable#configure(net.sf.hibernate.type.Type, java.util.Properties, net.sf.hibernate.dialect.Dialect) */ public void configure(net.sf.hibernate.type.Type type, Properties properties, net.sf.hibernate.dialect.Dialect arg2) throws net.sf.hibernate.MappingException { tableName = properties.getProperty("tableName"); this.type = type; typeClass = type.getReturnedClass().getName(); if(tableName == null) { String msg = "tableName was not specified by property tableName" ; log.fatal(msg); throw new MappingException(msg); } poolName = properties.getProperty("poolName"); // Set keys = config.getProperties().keySet(); // Iterator iter = keys.iterator(); // while(iter.hasNext()) // { // String ks = iter.next().toString(); // System.out.println(ks + "=" + config.getProperty(ks)); // } String jndiName = config.getProperty(Environment.DATASOURCE); if (jndiName==null) { String msg = "datasource JNDI name was not specified by property " + Environment.DATASOURCE; log.fatal(msg); return; //throw new HibernateException(msg); } String user = config.getProperty(Environment.USER); String pass = config.getProperty(Environment.PASS); try { Context ctx = new InitialContext(); ds = (DataSource)ctx.lookup(jndiName); } catch (Exception e) { log.fatal( "Could not find datasource: " + jndiName, e ); return; //throw new HibernateException( "Could not find datasource", e ); } //if (ds==null) throw new HibernateException( "Could not find datasource: " + jndiName ); if (ds==null) { log.info("Could not find datasource: " + jndiName); return; } log.info(tableName + " Using datasource: " + jndiName + " to get primary_key"); } }