Hibernate NamingStrategy 방식으로 월간표에 로그 쓰기

월별 로그 테이블 logYYMM : log_1011,log_1012, 테이블 구조는 완전히 같지만 테이블 이름이 다르기 때문에 이름 정책을 통해 데이터를 저장할 때 상응하는 월표에 자동으로 생성하고 기록한다.
Hibernate 구성 파일에 hbm2ddl을 설정하는 테이블을 자동으로 생성합니다.자동 업데이트

<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!");
 	}

}

좋은 웹페이지 즐겨찾기