gpt4 book ai didi

java - 如何使用 openjpa 将实体从一个数据库移动到另一个数据库?

转载 作者:搜寻专家 更新时间:2023-11-01 03:52:12 25 4
gpt4 key购买 nike

我试图将实体对象从一个数据库移动到另一个数据库,但没有成功。示例代码:

EntityManagerFactory emfFrom = Persistence.createEntityManagerFactory(fromPU);
EntityManager emFrom = emfFrom.createEntityManager();

EntityManagerFactory emfTo = Persistence.createEntityManagerFactory(toPU);
EntityManager emTo = emfTo.createEntityManager();

//Code to create sql for example 'select row from order row' where order is an entity

Query q = emFrom.createQuery(sql);
for(Object o: q.getResultList()) {
emFrom.detach(o);
emTo.persist(entity);
}

这导致:

Exception in thread "main" >org.apache.openjpa.persistence.EntityExistsException: Attempt to persist detached object "Order-1". If this is a new instance, make sure any version and/or auto-generated primary key fields are null/default when persisting. FailedObject: Order-1 at org.apache.openjpa.kernel.BrokerImpl.persistInternal(BrokerImpl.java:2628) at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2571) at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2554) at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2458) at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1077) at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:716)

我尝试使用合并而不是持久化,但数据库中没有保存任何行。我还尝试使用反射(因为它是私有(private)的)将 id 字段设置为 null,如下所示:

Field f = o.getClass().getDeclaredField("id");
f.setAccessible(true);
f.set(o, null);

但运气不好。我无法将版本字段设置为 null,因为它已经很长时间了,而 id filed 是一个 Long。我不知道这是否有帮助。

我正在使用 java 7 和 openjpa 2.2。关于如何移动实体的任何想法都会很棒。谢谢。

最佳答案

你混淆了你的 JPA 提供者,因为它会将你的实体包装在一个代理中,其中包含详细说明它相对于数据库的状态类型的信息(例如,它知道它已成功加载并且没有被修改)所以调用'使用不同的底层数据库保存'没有意义。

您需要创建该对象的副本(本质上是一个字段一个字段),然后持久化它,以便您的 JPA 提供者认为它是一个插入,而不是一个更新。

现在您可能会说您不想复制每个字段 - 它容易出错并且需要一段时间。一个好的技巧是转换为 JSON,然后再返回到新对象。

看看 Google 的 GSON:

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>

例如:

final SomeEntity oldInstance = new SomeEntity("hello");
final Gson gson = new Gson();
final String json = gson.toJson(oldInstance);
final SomeEntity newInstance = gson.fromJson(json, oldInstance.getClass());

您将需要 getters/setters 和非最终字段来执行此操作,因为 JSON 库在类上使用反射,否则您将不得不手动编写某种复制构造函数或构建器来逐字段执行此操作

关于java - 如何使用 openjpa 将实体从一个数据库移动到另一个数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23062033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com