Hibernate5.x動態表名實現

在網上搜索了很久,都沒有找到有關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();
}

}

測試結果


表名和我預想的一樣,數據成功插入表中


有什麼不足的還望各位大佬指點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章