java - JPA Annotation @Column(insertable=false) 被忽略,为什么?
问题描述
我希望在调用save()
方法时忽略其中一个字段。该字段将由数据库自动填充并返回。它应被视为只读字段。
我关心的private Timestamp ts;
领域:
@Entity
@Table(name = "time_series", schema = "ms")
@IdClass(Reading.class)
public class Reading implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "name", nullable = false)
private String sensorName;
@Id
@Column(name = "ts", insertable = false, updatable = false)
private Timestamp ts;
@Column(name = "reading")
private Double value;
...
如您所见,我insertable = false, updatable = false
在@Column
注释中使用 are,所以我希望ts
在幕后形成实际 SQL 时会忽略它。
@Override
@Transactional(readOnly = false)
public Reading save(Reading r) {
return readingRepository.save(r);
}
ReadingRepository基本上是 Spring 的CrudRepository的扩展,它有save(...)
方法。
当我保存Reading对象时,ts=null
我从 Postgres 收到一个错误:
错误:“ts”列中的空值违反非空约束
因为 Spring Data 实际上并没有根据我从日志中看到的内容忽略ts字段:
insert into ms.time_series (ts, name, reading) values (NULL, 'sensor1', 10.0)
显然,我希望查询没有这样的ts:
insert into ms.time_series (name, reading) values ('sensor1', 10.0)
为什么该字段不被忽略?
现在,如果您问我的数据库架构是否还可以,我说可以。当我在没有 ts 的控制台中键入 SQL 查询时,一切都很好。我什至尝试@Generated
和@GeneratedValue
注释。Name和ts都构成了表的主键,但是,如果我只将其中一个设为 PK 或添加额外的代理 ID 列,结果是相同的。结果一样...
我是否忽略了某些东西,或者 Spring 框架中是否存在错误?我正在使用 Spring 5.1.2 和 SpringData 2.1.2
注意:如果我使用@Transient
正确保留插入查询的注释,但即使在读取/获取时,该字段也会被完全忽略。
非常感谢您对此的任何帮助!
解决方案
推荐阅读
- python-3.x - Selenium 试图遍历一个表,但现在卡在第一个表上
- java - 如何强制 NetBeans 11.2 使用项目中打包的 gradle 包装器
- javascript - 使用 match 按指定时区的日期查找文档
- javascript - laravel中的js问题
- objective-c - NSScrollView setMagnification:centeredAtPoint:一个可能的错误?
- java - 如何在Java中显示这样的输出(条件:可以输入的元素最多10个)(图像)
- c# - 来自时间戳服务器的签名 pdf 缺少时间戳
- exception - UnauthorizedAccessException:对路径“D:\”的访问被拒绝
- java - LocalDateTime.toString - 可以在环境中配置格式吗?
- python-3.x - 我正在尝试构建一个简单的 webscraper 并不断收到此 SSL 错误: