use*_*445 5 java spring hibernate jpa spring-data-jpa
我希望在调用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;
...
Run Code Online (Sandbox Code Playgroud)
如您所见,我insertable = false, updatable = false在@Column注释中使用了are ,所以我希望ts在幕后形成实际 SQL 时会忽略它。
@Override
@Transactional(readOnly = false)
public Reading save(Reading r) {
return readingRepository.save(r);
}
Run Code Online (Sandbox Code Playgroud)
ReadingRepository基本上是 Spring 的CrudRepository 的扩展,它有save(...)方法。
当我保存阅读对象时,ts=null我从 Postgres 收到一个错误:
错误:“ts”列中的空值违反了非空约束
因为 Spring Data 实际上并没有忽略基于我从日志中看到的ts字段:
insert into ms.time_series (ts, name, reading) values (NULL, 'sensor1', 10.0)
Run Code Online (Sandbox Code Playgroud)
显然,我希望查询没有像这样的ts:
insert into ms.time_series (name, reading) values ('sensor1', 10.0)
Run Code Online (Sandbox Code Playgroud)
现在,如果您问我我的数据库架构是否正常,我会说是。当我在没有 ts 的控制台中键入 SQL 查询时,一切都很好。我什至尝试@Generated和@GeneratedValue注释。Name和ts都形成表的主键,但是,如果我只将其中一个作为 PK 或添加额外的代理 ID 列,结果是相同的。结果一样...
我是忽略了什么还是 Spring 框架中可能存在错误?我正在使用 Spring 5.1.2 和 SpringData 2.1.2
注意:如果我使用的@Transient注释正确地保留了插入查询,但是即使在读取/获取时该字段也被完全忽略。
非常感谢您对此的任何帮助!
| 归档时间: |
|
| 查看次数: |
1581 次 |
| 最近记录: |