【问题标题】:JPA - Default valueJPA - 默认值
【发布时间】:2013-09-24 05:55:58
【问题描述】:

我正在开发一个 JPA 应用程序,并且我正在使用 eclipse 链接提供程序。

我有一个表 T1,它的字段 F1 定义为非 null 并具有默认值 ('U')。

我已经定义了一个映射到表 T1 的实体。实体有一个属性映射到字段 F1,我已经用注解 @ReturnInsert(returnOnly = true) 配置了该属性。

文档说:

使用@ReturnInsert 使INSERT 操作将值返回到正在写入的对象中

如果我在映射到 F1 的属性中保留一个没有值的实体,则一切正常。实体在插入后自动填充默认值,并在数据库中插入一条记录。

但是如果我尝试使用不同的值(无默认值)持久化一个实体,则会将一条记录插入到数据库中,但字段 F1 的值是默认值,当它应该是我在实体中设置的值时.

为什么会这样?我只想更改默认值。

谢谢

【问题讨论】:

  • 如果您通过 JDBC 或数据库工具向数据库发出插入并包含该字段的值,会发生什么情况?尝试打开 EclipseLink 日志记录以查看它为插入发出的语句,并将该 SQL 直接发出到您的数据库。
  • 如果我通过包含字段值的数据库工具插入数据库,则插入是正确的。如果我打开 EclipseLink 日志记录,我可以看到插入根本不正确,因为不包括使用 @ReturnInsert 注释的字段。插入类似于:“INSERT INTO t1 (F2, F3) VALUES ('value1', 'value2') RETURNING F1 INTO ?. 因为 F1 不包括在内,所以不会覆盖默认值。

标签: jpa insert eclipselink


【解决方案1】:

我为数据库中的字段设置默认值所做的是:

  1. 在数据库中为该字段定义默认值
  2. 将实体中的相应属性设为只读。

例如,对于日期字段,您可以这样做:

在数据库中:

reg_date    DATE NOT NULL DEFAULT CURRENT_DATE  

在实体中:

@Basic(optional=false)
@Temporal(TemporalType.DATE)
@Column(name = "reg_date", insertable= false)
private Date regDate;

通过这样做,我得到了一个在插入新字段时始终由数据库自动设置的字段。

【讨论】:

  • 感谢您的回复。我已经完全按照您告诉我的方法进行了尝试,但它不起作用。我收到 java.sql.SQLException: ORA-01400: cannot insert NULL.
  • @Eduardo 你的数据库是什么?我用 PostgreSQL 进行了测试,它工作正常。但是 JPA 和 DB 不是那么匹配。我在将另一个字段设置为默认值时遇到问题,然后我决定忽略 DB 的默认值并将默认值放在 entity 构造函数s 中。
  • 我的数据库是 Oracle,我正在使用 eclipselink 提供程序。我读过有一个错误,并且 insertable= false 仅在可更新也是错误的情况下才有效。我找到了像你建议我的解决方案(实体构造函数),但我一点也不喜欢,因为如果有人更改 DB 中的默认值,我应该记得更改程序代码中的默认值。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 2014-10-06
  • 2021-10-22
  • 2016-05-27
  • 2015-07-31
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多