Java 没有完整行上下文的JPA DAO更新行
有一个大于70列的表 我在.java对象中使用了大约8列,包括Java 没有完整行上下文的JPA DAO更新行,java,jpa,entitymanager,Java,Jpa,Entitymanager,有一个大于70列的表 我在.java对象中使用了大约8列,包括id——不确定这是否重要 “我的Id”列包含以下内容: @Column(name = "pseudonym", nullable = false) @Basic(fetch = FetchType.EAGER) @Id 我的问题是: 如果我想使用xxxDAO.store(updatedRow)更新一行,我是否需要指定任何引用行ID的内容,或者我在这里缺少什么内容 我得到以下异常: DEBUG: org.sprin
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)代码>
澄清
我得到了上面的异常不是一个有效的月份
。这是因为我试图更新一个Oracle表,该表的列定义为时间戳。我试图传递一个字符串值(即使字符串的结构基本相同)
在尝试调试时,我的问题是,我是否可以通过JPA DAO更新一行,而不必在Java对象中定义所有70+列。事实证明这是可能的,异常与没有定义列无关。
这个异常仅仅是因为我试图更新的时间戳没有正确的结构。我将字符串更改为日期对象,它们更新了我的问题是:
如果我想使用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()
项
包含对要更新的行的引用
此外,在处理sql表中的时间戳时,请确保所有时间戳都是实际的日期对象,而不是字符串
将日期作为字符串拉入只读状态是可以的。但是,如果希望将来通过合并更新此行,则字符串将不起作用。日期的值将重新传递(作为字符串),并引发异常(例如,不是有效的月份)。确保您的日期/时间戳存储为日期对象,而不是字符串,并可能将其存储在UI上。对于@ID
属性,您不需要nullable=false
和FetchType.EAGER
。而TABLE
是一个关键字,如果您的ID列确实是这样命名的,您将不得不对其进行转义:@column(name=“\”TABLE\”)
@TobiasLiefke-很抱歉混淆,这是该表的笔名。感谢其他提示当您询问异常时,请始终发布完整的异常stck跟踪,以及导致此异常的代码。是的,我理解JB Nizet,但我无法这样做;抱歉。我不明白,附加部分与原始问题有什么关系?你应该首先在文章中扩展模型和异常,否则有人会发现你的解决方案。@TobiasLiefke-这是我在试图解决原始问题时遇到的问题-也许如果谷歌对它进行索引;甚至允许一个人查找/查看信息-这是值得的,但你仍然没有解释,为什么会出现异常-我认为这可能是日期问题,这就是为什么我要求将该信息添加到原始问题中。哦,抱歉,是的,异常是由日期问题引起的。我现在将补充这些细节