【问题标题】:Skip a column on INSERT with JPA使用 JPA 在 INSERT 上跳过一列
【发布时间】:2017-08-13 20:22:10
【问题描述】:

我有一个带有多个参数的 JPA/EclipseLink 模型,其值由 PostgreSQL 数据库设置为默认值。具体来说,我有:

  • SERIAL 类型的 id 列在添加新行时自动递增
  • created_at 类型为 TIMESTAMP 的列,默认为 now()

我的模型如下所示:

import javax.persistence.*;

@Entity
@Table(name="entity")
@NamedQuery(name="Entity.findAll", query="SELECT e from Entity e")
public class Entity {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Column(name="created_at")
    private java.sql.Timestamp createdAt;

    // constructor, getters, and setters
}

当我尝试在javax.persistence.EntityManager 中插入带有persist() 的行时,插入失败,因为正在为created_at 列设置NULL 值。我不想插入NULL,而是不想在该列中插入任何内容,并允许PostgreSQL将其设置为now()。本质上,我想在createdAt 上使用@GeneratedValue,但该注释仅用于主键,不能用于多个属性。我可以使用另一个注释来完成此操作吗?

【问题讨论】:

标签: java postgresql jpa eclipselink


【解决方案1】:

您可能希望 insertable=false 出现在 Column 注释中:

@Column(name="created_at", insertable=false)
private java.sql.Timestamp createdAt;

发件人:http://docs.oracle.com/javaee/5/api/javax/persistence/Column.html

布尔可插入 (可选)该列是否包含在持久化提供的 SQL INSERT 语句中

【讨论】:

    【解决方案2】:

    正如另一个答案中提到的,如果您将其标记为 insertable=true(默认值),JPA 提供程序将在插入时设置该值。即使为 null,许多提供程序也会发生这种情况,因为它允许语句重用。

    只是从语句中排除它可能不是您想要的,因为在您的实体(和缓存中)中具有值将需要刷新。 EclipseLink 虽然有@ReturningInsert,它允许EclipseLink 使用数据库中的值更新实体。不幸的是,仅支持 Oracle - 其他数据库需要使用存储过程来返回运行插入并返回值。

    【讨论】:

      【解决方案3】:

      您可以在实体类中添加@DynamicInsert。如果没有此注释,插入语句将包含空字段。另外,您可以在执行更新语句时添加@ DynamicUpdate

      @Entity
      @DynamicInsert
      @DynamicUpdate
      @Table(name="entity")
      @NamedQuery(name="Entity.findAll", query="SELECT e from Entity e")
      public class Entity {
          @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
          private Integer id;
      
          @Column(name="created_at")
          private java.sql.Timestamp createdAt;
      
          // constructor, getters, and setters
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        相关资源
        最近更新 更多