使用JPA在INSERT上跳过一列

时间:2017-03-21 22:36:13

标签: java postgresql jpa eclipselink

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

  • id类型的SERIAL列,在添加新行时会自动递增
  • created_atTIMESTAMP列,默认为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
}

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

3 个答案:

答案 0 :(得分:3)

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语句中提供

答案 1 :(得分:1)

如另一个答案所述,如果您将其标记为insertable = true(默认值),JPA提供程序将在insert上设置值。许多提供者都会发生这种情况,即使是null,因为它允许语句重用。

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

答案 2 :(得分:1)

您可以在实体类上添加@DynamicInsert。没有此注释时,insert语句将包含空字段。另外,您可以在执行更新语句时添加@ 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
}