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();
}

}

测试结果


表名和我预想的一样,数据成功插入表中


有什么不足的还望各位大佬指点。

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