将JPA应用程序调整到另一个数据库时可用的选项

时间:2015-11-25 22:16:10

标签: java mysql hibernate jpa

我对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” ,这不适用于我当前的映射。更改数据库列不是我的选择,我只能控制应用程序代码。

我有什么选择?什么是最好的实践?我想过以某种方式在运行时获取类名并将其附加到列。这是个好主意吗?顺便说一下,我正在使用休眠。

感谢您的时间。

2 个答案:

答案 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")),
})