我有一个带有多个参数的JPA / EclipseLink模型,其值由PostgreSQL数据库设置为默认值。具体来说,我有:
id
类型的SERIAL
列,在添加新行时会自动递增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
}
当我尝试在persist()
中插入javax.persistence.EntityManager
行时,插入失败,因为正在为NULL
列设置created_at
值。我想简单地不在该列中插入任何内容,而是允许PostgreSQL将其设置为NULL
,而不是插入now()
。基本上,我想在@GeneratedValue
上使用createdAt
,但该注释仅适用于主键,不能用于多个属性。我可以使用另一个注释来完成这个吗?
答案 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
}