由于我无法控制的决定,我有两个几乎是克隆的现有数据库。
“几乎”,因为 #1 中的表/列在 #2 中不存在,反之亦然。
这里最好的方法是什么?
“蛮力”路线似乎是“为一个创建所有实体,复制到新包并为第二个数据库添加/删除”。这不是我真正想走的路线。
哦,绝对不允许 JPA 更改任一数据库中的模式。
除了 EclipseLink,我还使用 Spring 3.1 和 SpringData。
由于我无法控制的决定,我有两个几乎是克隆的现有数据库。
“几乎”,因为 #1 中的表/列在 #2 中不存在,反之亦然。
这里最好的方法是什么?
“蛮力”路线似乎是“为一个创建所有实体,复制到新包并为第二个数据库添加/删除”。这不是我真正想走的路线。
哦,绝对不允许 JPA 更改任一数据库中的模式。
除了 EclipseLink,我还使用 Spring 3.1 和 SpringData。
您可能想查看 EclipseLink 的可扩展性支持。
您可以将属性映射添加到类中,并使用 orm.xml 将其他数据库中的附加属性映射到此映射中。
见, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Extensible_Entities
如果您的数据库不同,您需要制作不同的类/映射。例如,如果您Foo
在两个数据库中都有一个表,该表在 db1 ( id
, baz
, pleh
) 中有 3 列,在 db2 ( id
, baz
, qux
) 中有 3 个其他列,则不能这样做:
@Entity
public class Foo
{
@Column(name = "id")
private Long id;
@Column(name = "baz")
private String baz;
@Column(name = "pleh")
private String pleh;
@Column(name = "qux")
private String qux;
}
这样做会导致异常,因为 JPA 将生成插入语句,例如:
insert into Foo (id, baz, pleh, qux) values (?, ?, ?, ?)
对于 DB1,您需要Foo
像这样创建一个类:
@Entity
public class Foo
{
@Column(name = "id")
private Long id;
@Column(name = "baz")
private String baz;
@Column(name = "pleh")
private String pleh;
}
对于这样的 DB2:
@Entity
public class Foo
{
@Column(name = "id")
private Long id;
@Column(name = "baz")
private String baz;
@Column(name = "qux")
private String qux;
}