Hibernate NamingStrategy方式 向月表中写日志

按月命名的日志表如log_YYMM:log_1011,log_1012,表结构完全相同,只是表名不同,通过命名策略实现存数据时自动创建和写入到相应的月表中。

自动创建表,在Hibernate的配置文件中设hbm2ddl.auto为update

<hibernate-configuration>

<session-factory>
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	<property name="connection.url">jdbc:mysql:///test</property>
	<property name="connection.username">root</property>
	<property name="connection.password">root</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="myeclipse.connection.profile">mysql</property>

	<property name="hbm2ddl.auto">[b]update[/b]</property>

	<mapping class="db.TDiykey" />
	<mapping class="db.Person" />

</session-factory>

</hibernate-configuration>
/**
 * 月表命名策略
 * 
 * @author hzhlu
 * 
 */
public class MyNamingStrategy extends DefaultNamingStrategy {

	private static final long serialVersionUID = 1L;

	public static final MyNamingStrategy INSTANCE = new MyNamingStrategy();
	private static final DecimalFormat df = new DecimalFormat();
	private static ArrayList<String> rollingTables = new ArrayList<String>();
	static {
		rollingTables.add("PERSON");
		df.applyPattern("00");
	}

	/**
	 * 向月表中保存数据
	 * 
	 * @see net.sf.hibernate.cfg.NamingStrategy#tableName(java.lang.String)
	 */
	public String tableName(String tableName) {
		String stroeTable = tableName;
		// 对指定的表名计算月表的实际存储表名
		if (rollingTables.contains(tableName.toUpperCase())) {
			stroeTable += "_" + df.format(Calendar.getInstance().get(Calendar.YEAR) % 100)
					+ df.format(Calendar.getInstance().get(Calendar.MONTH) + 1);
			System.out.println("store record into [" + stroeTable + "]");
		}

		return stroeTable;
	}

}

修订自动生成的HibernateSessionFactory增加命名策略,只需添加一行即可。

configuration.setNamingStrategy(MyNamingStrategy.INSTANCE);
public class MySessionFactory {
	private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	private static Configuration configuration = new AnnotationConfiguration();
	private static org.hibernate.SessionFactory sessionFactory;
	private static String configFile = CONFIG_FILE_LOCATION;

	static {
		try {
			// 添加月表命名策略
			configuration.setNamingStrategy(MyNamingStrategy.INSTANCE);
			
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}

测试程序

public class MyNamingStrategyTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		test2();
	}

	public static void test2() {
 		Session session = MySessionFactory.getSession();
		Transaction tx = session.beginTransaction();

		Person person = new Person();
		person.setId(new Random().nextInt());
		person.setFirstName("firstName");
		person.setLastName("lastName");
		session.save(person);

		TDiykey tDiykey = new TDiykey();
		tDiykey.setDbid("" + System.currentTimeMillis() % 999999);
		tDiykey.setNotes("notes");
		session.save(tDiykey);

		tx.commit();
		session.close();

		System.out.println("ok!");
 	}

}

相关推荐