拥有一个包含> 70列的表格。
我在.java对象中使用了大约8个这些列,包括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表。我试图传递一个String值(即使String基本上是相同的结构)。
为了尝试调试这个,我的问题是我是否可以通过JPA DAO更新一行而不需要例如我的Java对象中定义的所有70多列。事实证明这是可能的,并且该例外与没有定义列无关。 唯一的例外是因为我试图更新的时间戳没有正确的结构。我将Strings更改为Date对象,然后更新了
答案 0 :(得分:0)
我的问题是:
如果我想使用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对象而不是字符串。
将日期作为字符串拉为只读时很好。但是如果您希望以后通过合并更新此行,则String将不起作用。日期的值将再次重新传递(作为String),并导致抛出异常(例如,不是有效的月份)。确保您的日期/时间戳存储为Date对象而不是字符串,并且可能在UI上将它们串起来。