我对JPA很新,我遇到了JPA应用程序的问题。
我正在使用BaseEntity概念映射到其当前数据库的应用程序,其中所有实体都扩展了这个。此BaseEntity的“id”列映射如下:
/**
* Getter for the id.
*
* @return id Represents the primary key column of the record.
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id",nullable = false)
public Long getId() {
return id;
}
所有实体都对此进行了扩展,这适用于当前数据库。
现在我的任务是调整此应用程序以开始使用另一个类似的数据库,但主要区别在于,在这个其他数据库上,所有表的主键都命名为“table_name_”+“id” ,这不适用于我当前的映射。更改数据库列不是我的选择,我只能控制应用程序代码。
我有什么选择?什么是最好的实践?我想过以某种方式在运行时获取类名并将其附加到列。这是个好主意吗?顺便说一下,我正在使用休眠。
感谢您的时间。
答案 0 :(得分:0)
您可以为其他数据库使用特定的映射文件。
但只要您没有其他列以_id
结尾,就可以更轻松地为您的当前数据库使用自定义NamingStrategy
。
添加与其他数据库匹配的ID:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "my_table_id")
public Long getId() {
return id;
}
对于当前数据库,您可以扩展DefaultNamingStrategy
:
public class CurrentDatabaseNamingStrategy extends DefaultNamingStrategy {
public String columnName(String columnName) {
if (propertyName.endsWith("_id")) {
return "id";
}
}
}
现在,您可以在persistence.xml
中为当前数据库定义一个:
<persistence-unit...>
<properties>
<property name="hibernate.ejb.naming_strategy" value="CurrentDatabaseNamingStrategy" />
</properties>
</persistence-unit>
不幸的是,NamingStrategy
没有将实体类或表名称作为参数 - 因此您无法使用该解决方案坚持旧的Column
注释。
答案 1 :(得分:-1)
使用以下方法简单地注释您的实体类:
@AttributeOverrides({
@AttributeOverride(name="id", column=@Column(name="table_name_id")),
})