NamingStrategy是用来定义表名和列名与实体类之间映射规则的一个借口。(A set of rules for determining the physical column and table names given the information in the mapping document.)它可以实现业务类规范与数据表规范之间的映射。
首先介绍一个实例。
1)定义一个用于描述一则消息的实体类。(包括消息的唯一标识以及该消息的内容)
package com.lreis.hibernate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Msg {
// 唯一标识
private int id;
// 消息内容
private String cont;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCont() {
return cont;
}
public void setCont(String cont) {
this.cont = cont;
}
}
2)定义自己的NamingStrategy
package com.lreis.hibernate;
import org.hibernate.cfg.DefaultNamingStrategy;
import org.hibernate.util.StringHelper;
public class MyNamingStrategy extends DefaultNamingStrategy {
public final String TABLE_PREFIX = "t_";
public final String COLUMN_PREFIX = "col_";
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String tableName(String tableName) {
System.out.println("table=" + tableName);
return TABLE_PREFIX + tableName;
}
@Override
public String classToTableName(String className) {
System.out.println("class=" + className);
return tableName(StringHelper.unqualify(className).toUpperCase());
}
}
3)编写自己的测试类
package com.lreis.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class HibernateNameStrategyTest {
private static SessionFactory sessionFactory;
@BeforeClass
public static void beforeClass() {
try {
sessionFactory = new AnnotationConfiguration().setNamingStrategy(new MyNamingStrategy()).configure().buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testSave() {
Session session = sessionFactory.openSession();
session.beginTransaction();
for (int i = 0; i < 10; i++) {
Msg m = new Msg();
m.setCont("m-" + i);
session.save(m);
}
session.getTransaction().commit();
session.close();
}
@AfterClass
public static void afterClass() {
sessionFactory.close();
}
}
这样实体类Msg就建立了与数据库表格t_msg的映射关系。
注:
1) NamingStrategy有10个接口方法,分别定义了表名、列名、外键等与实体类之间的映射关系。
2) NamingStrategy有两个已有的实现类:DefaultNamingStrategy与ImprovedNamingStrategy。本实例中使用了DefaultNamingStrategy。
3)classToTableName与tableName的区别在于:当实体类中使用了@Table或者在Msg类对应的XML文件中使用了"table"属性,NamingStrategy调用tableName()方法,否则调用classToTableName()方法.同理propertyToColumnName与columnName的原理类似。