没有完整行上下文的 JPA DAO 更新行

JPA DAO Update row without full row context

有一个 table 超过 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 table,它有一个定义为时间戳的列。我试图传递一个字符串值(即使字符串的结构基本上相同)。

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

我的问题是:

If I want to update a row using xxxDAO.store(updatedRow) - do I need to specify anything to reference the row ID or am I missing something here?

回答

No - 它是自动管理的,您不需要指定标识符,也不需要为 [=] 中的所有列创建所有引用31=] 在你的 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 table 中的时间戳时,请确保所有这些都是实际的日期对象,而不是字符串。

将日期作为只读字符串拉取时没问题。但是,如果您想在将来通过合并更新此行,则 String 将不起作用。日期的值将再次重新传递(作为字符串),并导致抛出异常(例如,不是有效的月份)。确保您的 dates/timestamps 存储为 Date 对象而不是字符串,并且可能将它们存储在 UI.