在網上搜索了很久,都沒有找到有關Hibernate5.x版本的動態表名的詳細說明,大多都是講解ImplicitNamingStrategy和PhysicalNamingStrategy。
對於新手的我來說,看起來有點生硬,要是有個demo就一目瞭然了。
直接上demo吧
需求:
每天需要生成一個表,表名爲gprsdata_2017_12_18
映射文件都不說了,直接寫關鍵的地方吧
不管是指定了表名還是沒有指定表名,都會調用PhysicalNamingStrategy,所以直接重寫physicalNamingStrategyStandardImpl裏面的toPhysicalTableName()方法就可以了。
首先重寫,命名爲MyPhysicalNamingStrategyStandardImpl
package
com.meet.hibernate;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
public class MyPhysicalNamingStrategyStandardImpl extends
PhysicalNamingStrategyStandardImpl {
protected static Format format = new SimpleDateFormat("yyyy_MM_dd");
@Override
public Identifier toPhysicalTableName(Identifier name,
JdbcEnvironment context) {
Date date = new Date();
return Identifier.toIdentifier("GprsData_"+format.format(date));
}
}
然後就是調用測試
package com.meet.hibernate;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class App {
private static MyPhysicalNamingStrategyStandardImpl physicalNamingStrategyStandardImpl = new MyPhysicalNamingStrategyStandardImpl();
private static Configuration configuration = new Configuration().configure();
static{
configuration.setPhysicalNamingStrategy(physicalNamingStrategyStandardImpl);//
}
private static SessionFactory sessionFactory =configuration.addClass(User.class)//
.buildSessionFactory();
@Test
public void testSave(){
Session session = sessionFactory.openSession();
session.beginTransaction();
//-------------------------------------------
Date date = new Date();
User user = new User();
user.setName("meet"+date.toLocaleString());
user.setBirthday(date);
session.save(user);
//-------------------------------------------
session.getTransaction().commit();
session.close();
}
}
測試結果
表名和我預想的一樣,數據成功插入表中
有什麼不足的還望各位大佬指點。