【问题标题】:JPA DAO Update row without full row context没有完整行上下文的 JPA DAO 更新行
【发布时间】:2015-06-25 10:55:45
【问题描述】:

有一个 >70 列的表格。

我将其中大约 8 个列与 .java 对象一起使用,包括 id - 不确定这是否重要。

我的 ID 列有以下内容:

@Column(name = "pseudonym", nullable = false)
@Basic(fetch = FetchType.EAGER)
@Id

我的问题是这样的:

如果我想使用 xxxDAO.store(updatedRow) 更新一行 - 我需要指定任何内容来引用行 ID 还是我在这里遗漏了什么?

我收到以下异常:

DEBUG: org.springframework.web.servlet.DispatcherServlet - Could not complete request
javax.persistence.PersistenceException: org.hibernate.exception.DataException: Could not execute JDBC batch update
.. ~(adding this in here)~ not a valid month

希望我已经充分解释了这一点。如果我还没有,请告诉我。

提前致谢

一些伪代码供参考:

item = dao.getItemById(123);
item.setUpdateTime(theTime);
dao.store(item);

商店:return getEntityManager().merge(itemToStore);


澄清

我在not a valid month 上面遇到了异常。这是因为我试图更新一个具有定义为时间戳的列的 Oracle 表。我试图传递一个字符串值(即使字符串的结构本质上是相同的)。

为了调试这个问题,我的问题是我是否可以通过 JPA DAO 更新一行而无需例如我的 Java 对象中定义的所有 70 多列。事实证明这是可能的,并且异常与没有定义的列无关。 例外只是因为我试图更新的时间戳没有正确的结构。我将字符串更改为日期对象,并且它们更新了

【问题讨论】:

  • @ID 属性不需要 nullable=falseFetchType.EAGER。而TABLE是一个关键字,如果你的ID列真的是这样命名的,你将不得不转义它:@COLUMN(name="\"TABLE\"")
  • @TobiasLiefke - 很抱歉造成混淆,这是表格的化名。感谢其他指针
  • 当您询问异常时,请务必发布完整的异常 stck 跟踪以及导致此异常的代码。
  • 是的,我了解 JB Nizet,但我不能这样做;道歉。

标签: java jpa entitymanager


【解决方案1】:

我的问题是这样的:

如果我想使用 xxxDAO.store(updatedRow) 更新一行 - 我需要 指定任何内容以引用行 ID,或者我错过了什么 在这里?

回答

- 它是自动管理的,您不需要指定标识符,也不需要在 java 对象中为表中的所有列创建所有引用。

item = dao.getItemById(123); // get item from dao in the database
item.setUpdateTime(theTime); // set/or change a value
dao.store(item); // contains merge(), and subsequently flush()

item 包含对要更新的行的引用。


此外,在处理 sql 表中的时间戳时,请确保所有时间戳都是实际的日期对象而不是字符串。

将日期作为字符串提取为只读时很好。但是,如果您以后想通过合并更新此行,则字符串将不起作用。日期的值将再次被重新传递(作为字符串),并导致抛出异常(例如,不是有效的月份)。确保您的日期/时间戳存储为 Date 对象而不是字符串,并且可能在您的 UI 上将它们存储为字符串。

【讨论】:

  • 我不明白,Additionally 部分与原始问题有什么关系?您应该先在帖子中扩展模型和异常,否则遇到相同问题的人将找不到您的解决方案。
  • @TobiasLiefke - 这是我在尝试解决原始问题时遇到的问题 - 也许如果 Google 将其编入索引;甚至允许一个人查找/查看信息 - 这是值得的
  • 但是您仍然没有解释,为什么您确实遇到了异常 - 我认为这是日期问题,这就是为什么我要求将该信息添加到您的原始问题中。
  • 抱歉,是的,异常是由日期问题引起的。我现在将添加这些详细信息
猜你喜欢
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2012-06-19
  • 2013-01-15
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多