Mik*_*cki 12 java hibernate jpa
是否可以覆盖JPA/Hibernate中的表名,以便为所有项目实体添加公共前缀?例如,能够通过"JBPM5_"前缀为所有JBPM 5表添加前缀.
接受答案的示例:
public class JBPM5NamingStrategy extends ImprovedNamingStrategy {
public String classToTableName(String className) {
return StringHelper.unqualify(className);
}
public String propertyToColumnName(String propertyName) {
return propertyName;
}
public String tableName(String tableName) {
return "JBPM5_" + tableName;
}
public String columnName(String columnName) {
return columnName;
}
public String propertyToTableName(String className, String propertyName) {
return "JBPM5_" + classToTableName(className) + '_'
+ propertyToColumnName(propertyName);
}
}
Run Code Online (Sandbox Code Playgroud)
Ral*_*lph 25
一次重命名所有表的一种方法是实现自己的namingStrategy(实现org.hibernate.cfg.NamingStrategy).
使用的NamingStrategy在persistence.xml中指定
<property name="hibernate.ejb.naming_strategy"
value="com.example.MyNamingStrategy" />
Run Code Online (Sandbox Code Playgroud)
Sea*_*oyd 21
使用NamingStrategy.我之前的答案应该提供您所需要的.
从以前的答案复制:
下面是一个示例NamingStrategy,它为连接表构建TYPE1_TYPE2形式的表名,并为所有表添加一个公共前缀:
public class CustomNamingStrategy extends ImprovedNamingStrategy {
private static final long serialVersionUID = 1L;
private static final String PREFIX = "PFX_";
@Override
public String classToTableName(final String className) {
return this.addPrefix(super.classToTableName(className));
}
@Override
public String collectionTableName(final String ownerEntity,
final String ownerEntityTable, final String associatedEntity,
final String associatedEntityTable, final String propertyName) {
return this.addPrefix(super.collectionTableName(ownerEntity,
ownerEntityTable, associatedEntity, associatedEntityTable,
propertyName));
}
@Override
public String logicalCollectionTableName(final String tableName,
final String ownerEntityTable, final String associatedEntityTable,
final String propertyName) {
return this.addPrefix(super.logicalCollectionTableName(tableName,
ownerEntityTable, associatedEntityTable, propertyName));
}
private String addPrefix(final String composedTableName) {
return PREFIX
+ composedTableName.toUpperCase().replace("_", "");
}
}
Run Code Online (Sandbox Code Playgroud)
在Hibernate 5中,您仍然需要自己实现此行为.但是,现在存在隐式和物理命名策略.
这是使用Hibernate 5为表名添加前缀的示例性实现:
package my.app;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
public class PrefixPhysicalNamingStrategy extends PhysicalNamingStrategyStandardImpl {
/**
* TODO Make this an injectable application property
*/
public static final String TABLE_NAME_PREFIX = "MY_PREFIX_";
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
Identifier newIdentifier = new Identifier(TABLE_NAME_PREFIX + name.getText(), name.isQuoted());
return super.toPhysicalTableName(newIdentifier, context);
}
}
Run Code Online (Sandbox Code Playgroud)
使用Spring Boot 2的此配置属性来激活物理命名策略:
spring.jpa.hibernate.naming.physical-strategy: my.app.PrefixPhysicalNamingStrategy
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17434 次 |
| 最近记录: |