gpt4 book ai didi

java - Hibernate saveOrUpdate,更新需要原始行的所有字段

转载 作者:可可西里 更新时间:2023-11-01 08:20:52 26 4
gpt4 key购买 nike

我正在使用 mysql 和 hibernate 在表中插入和更新行。我使用 saveOrUpdate 调用。现在,当我尝试更新表中的一行时,出现异常。异常指出我的列 requestTime 不能为空。显然这是真的,因为我已将列属性设置为 NotNull。

我可以添加行。但是当用另外 2 列的值更新它时,我得到了这个异常。

我假设在更新时,我需要从表中读取行,然后更新整行。真的吗 ?我有点希望 hibernate saveOrUpdate 会为我做这件事。因此,当我插入新行时,我有一个对象具有所有列的 setter/getter 。但是当我更新时,我有一个只有主键和新列的 getter 的对象。

Transaction txD;
Session session;
session = currentSession();
txD = session.beginTransaction();
session.saveOrUpdate(dataStore);
txD.commit();

异常

749368 [Thread-2] DEBUG org.hibernate.internal.util.EntityPrinter  - com.mcruiseon.carpool.concrete.SubscribeProviderConcrete{acceptedTime=Mon Jul 30 03:39:23 UTC 2012, requestTime=null, subscriberIdentityHash=1218553253, requestIdentity=167093126, subscribedProviderHash=-284086361, isAccepted=true}
749375 [Thread-2] DEBUG org.hibernate.SQL - update carPoolSubscribedProvider set subscriberIdentityHash=?, requestTime=?, subscribedProviderHash=?, isAccepted=?, acceptedTime=? where requestIdentity=?
749398 [Thread-2] DEBUG org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Column 'requestTime' cannot be null [n/a]
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'requestTime' cannot be null

从 carPoolSubscribedProvider 中选择 *

+-----------------+------------------------+---------------------+------------------------+------------+--------------+
| requestIdentity | subscriberIdentityHash | requestTime | subscribedProviderHash | isAccepted | acceptedTime |
+-----------------+------------------------+---------------------+------------------------+------------+--------------+
| 167093126 | -284086361 | 2012-07-27 16:13:19 | 1218553253 | 0 | NULL |
+-----------------+------------------------+---------------------+------------------------+------------+--------------+

编辑:

| carPoolSubscribedProvider | CREATE TABLE `carPoolSubscribedProvider` (
`requestIdentity` varchar(50) NOT NULL DEFAULT '',
`subscriberIdentityHash` varchar(100) NOT NULL,
`requestTime` datetime NOT NULL,
`subscribedProviderHash` varchar(100) DEFAULT NULL,
`isAccepted` tinyint(1) DEFAULT '0',
`acceptedTime` datetime DEFAULT NULL,
PRIMARY KEY (`requestIdentity`),

最佳答案

Hibernate 无法确定您希望如何处理具有空值的属性。它不能区分以下情况:

  1. 某些属性为 null -> 应在数据库中设置为 null
  2. 某些属性为空 -> 不应更新此类属性。

将先前非空的属性值设置为空意味着应更改属性值。

如果你想让列永远不会成为更新语句的一部分,你可以在 @Column 中将 updatable 属性设置为 false注解。根据它定义的文档:该列是否包含在持久性提供程序生成的 SQL UPDATE 语句中

关于java - Hibernate saveOrUpdate,更新需要原始行的所有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11720876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com