eme*_*ava 6 java orm hibernate jpa
所以我有这个现有的数据库模式,其中包含许多我想用JPA/Hibernate建模的表.每个表具有相同的30个附加列组(以允许运行时扩展记录的字段数).
CREATE TABLE XX
(
"ID" VARCHAR2(100 BYTE) NOT NULL ENABLE,
"USER_LABEL" VARCHAR2(256 BYTE),
"CREATION_DATE" NUMBER(38,0) NOT NULL ENABLE,
"ADD_STR_FIELD_0" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_0" NUMBER(38,0),
"ADD_DBL_FIELD_0" NUMBER(38,0),
"ADD_STR_FIELD_1" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_1" NUMBER(38,0),
"ADD_DBL_FIELD_1" NUMBER(38,0),
"ADD_STR_FIELD_2" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_2" NUMBER(38,0),
"ADD_DBL_FIELD_2" NUMBER(38,0),
"ADD_STR_FIELD_3" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_3" NUMBER(38,0),
"ADD_DBL_FIELD_3" NUMBER(38,0),
"ADD_STR_FIELD_4" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_4" NUMBER(38,0),
"ADD_DBL_FIELD_4" NUMBER(38,0),
"ADD_STR_FIELD_5" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_5" NUMBER(38,0),
"ADD_DBL_FIELD_5" NUMBER(38,0),
"ADD_STR_FIELD_6" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_6" NUMBER(38,0),
"ADD_DBL_FIELD_6" NUMBER(38,0),
"ADD_STR_FIELD_7" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_7" NUMBER(38,0),
"ADD_DBL_FIELD_7" NUMBER(38,0),
"ADD_STR_FIELD_8" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_8" NUMBER(38,0),
"ADD_DBL_FIELD_8" NUMBER(38,0),
"ADD_STR_FIELD_9" VARCHAR2(200 BYTE),
"ADD_LNG_FIELD_9" NUMBER(38,0),
"ADD_DBL_FIELD_9" NUMBER(38,0),
}
Run Code Online (Sandbox Code Playgroud)
我计划为每个表定义简单的类
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="XX")
public class XX {
@Id
Long id = null;
}
Run Code Online (Sandbox Code Playgroud)
然后在公共类中定义公共附加参数
import javax.persistence.Column;
public abstract class AdditionalParameters {
@Column(name="ADD_STR_FIELD_0")
private String addStringField0 = null;
@Column(name="ADD_LNG_FIELD_0")
private Long addLongField0 = null;
@Column(name="ADD_DBL_FIELD_0")
private Double addDoubleField0 = null;
....
....
....
@Column(name="ADD_STR_FIELD_8")
private String addStringField8 = null;
@Column(name="ADD_LNG_FIELD_8")
private Long addLongField8 = null;
@Column(name="ADD_DBL_FIELD_8")
private Double addDoubleField8 = null;
}
Run Code Online (Sandbox Code Playgroud)
虽然这会奏效,但我不喜欢班级的硬编码性质.
我想将每组字符串,长字段和双字段模型作为附加参数组,然后具有0..9组.如果需要,这将允许我稍后轻松添加额外的组.
如果我使用xml映射解决方案,我可以在为每个表生成.hbm.xml时动态确定正确的列名.我更喜欢使用带注释的解决方案,但有没有办法覆盖@Column getName()方法,以便我可以返回动态生成的列名?
Sea*_*oyd 14
您需要创建自定义NamingStrategy.
假设您在JPA中使用spring和hibernate,这是一个带有自定义NamingStrategy的配置代码段:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myunit" />
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation"
value="classpath:META-INF/persistence.xml" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="generateDdl" value="true" />
<property name="database" value="MYSQL" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop
key="hibernate.ejb.naming_strategy">
com.yourcompany.CustomNamingStrategy
</prop>
</props>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
如果不使用spring,配置会有所不同,但您仍然可以使用自定义NamingStrategy(请参阅从Hibernate文档实现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)
| 归档时间: |
|
| 查看次数: |
13012 次 |
| 最近记录: |