【问题标题】:JPA EntityManager inconsistently adding objects to databaseJPA EntityManager 不一致地将对象添加到数据库
【发布时间】:2017-01-22 11:32:26
【问题描述】:

我正在使用 JPA EntityManager 将项目插入 MySQL 数据库,我有代码读取文件、收集数据,然后将该数据添加到适当的文件中。我正在写的是我正在尝试做的事情的简化版本,我感谢 100% 这两者都让我更难理解我实际在做什么,并且可能隐藏错误的来源,所以谢谢你的包容与我一起。我使用的对象p是前面生成的,是一个LinkedHashMap的形式

LinkedHashMap<String MyObject>

其中“MyObject”是一个具有多个属性的类,例如“name”、“weight”、“color”,而 String 是用作主键的 UUID。

private final EntityManagerFactory emf = Persistence.createEntityManagerFactory(myUI.PERSISTENCE_UNIT);
private final EntityManager em = emf.createEntityManager();

for (String key : p.keySet()) {
    databaseWriter.writeToDatabase(em, key, p.get(key).getName(),
    p.get(key).getColor(), p.get(key).getWeight();
}

而“databaseWriter.writeToDatabase”的相关代码是

public void writeToDatabase (EntityManager em, String id, String name,String Color, String weight) {
    em.GetTransaction().begin();
    MyObjectTable mt = new MyObjectTable();
    mt.setId(id);
    mt.setColor(color);
    mt.setWeight(weight);
    mt.setName(name);
    em.persist(mt);
    em.getTransaction().commit();
}

我已经确认我正在以正确的形式生成对象并将信息正确地传递给函数,但我的行为最奇怪。假设“p”中有15个项目,它只会添加其中的几个,它添加的几个并不一致,甚至连“几个”是多少都不一致。我希望它是因为我正在用 EntityManager 做一些愚蠢的事情,这在这里很明显。

如果您需要比这更多的详细信息,我很乐意提供它们,我只是想不出什么会导致仅添加一些对象(并且添加的那些对象具有正确的信息),但只有特定的少数,在随后的尝试中不是相同的少数,并且根本没有弹出错误。

编辑:我使用的 jpa 提供程序是 EclipseLink,我用我错过的东西编辑了工厂

编辑:这里是一个示例,一个输入的数据的 Eclipse 服务器日志,它没有显示在数据库中,任何人都可以从中收集任何东西吗?

[EL Finest]: query: 2016-09-14 12:18:23.867--UnitOfWork(1915196068)--Thread(Thread[http-nio-8084-exec-252,5,main])--Execute query InsertObjectQuery(com.myfiles.stuff_the.PartTable[   idPart=99a26bca-d818-4959-a328-75c1f05a1e38 ])
[EL Fine]: sql: 2016-09-14 12:18:23.867--ClientSession(1291663611)--Connection(1232332820)--Thread(Thread[http-nio-8084-exec-252,5,main])--INSERT INTO PartTable (idPart, dateCreated, description, hash, isBasic, lastModified, name, riskGroup, authorId, formatId, nucseqId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [99a26bca-d818-4959-a328-75c1f05a1e38, 2016-09-14 12:18:23.82, , null, 1, 2016-09-14 12:18:23.82, AXL2 mRNA, null, 1, null, d6f807f0-ac91-4421-8ff2-4940706fd5bb]

我查看了整个日志文件,找不到任何错误,persist() 和 commit() 语句的数量正确,不太确定发生了什么。

【问题讨论】:

  • 这就是 JPA 提供程序日志的用途
  • 我是第一次使用 JPA,什么是提供程序日志以及如何查看它?
  • 您选择了一些 JPA 实现(Hibernate、EclipseLink、DataNucleus、OpenJPA ?)作为您的 JPA 提供者。他们的软件会创建一个日志。查看您选择的软件的文档。
  • 请指定persistence provider。在不知道您使用的提供商的情况下,我们无法为您提供帮助。另一件事是,您正在创建一个没有传递持久性上下文名称的持久性工厂。你有persistence.xml 文件吗?
  • 已添加,对不起,我必须对此保持简洁,我知道这让我更难提供帮助,但由于几个原因,我无法将整个内容粘贴到此处。是的,有一个 persistence.xml 文件

标签: java mysql jpa


【解决方案1】:

原来问题不在于下面这行

em.clear();

在我使用提交之后

【讨论】:

  • 您还必须在 JPA 中检查会话刷新。冲洗策略也很重要。
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多