在 Hibernate 中如何仅在序列化期间而不是在反序列化期间忽略 属性
In Hibernate how to ignore a property only during serialization and not in deserialization
有个table
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`lastmodifiedTimestamp` DATETIME ON UPDATE CURRENT_TIMESTAMP,
`creationTimestamp` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `Unique` (`name`)
)
和一个实体 class,我将其用于 Json 转换以及数据库存储。
这里的问题是,当我尝试创建一个测试时,hibernate 给出了一个异常 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'creationTimestamp' cannot be null
但是我可以 运行 sql 查询而不传递时间戳 fields.How 我可以让休眠避免在插入查询中发送这些时间戳字段吗?
我不能将它们标记为瞬态,因为我在反序列化期间需要时间戳字段。当我获取测试对象时。
它无论如何给出 Caused by: javax.persistence.EntityNotFoundException: No row with the given identifier exists perhaps because both @Column and @Transient on the fields
下面是实体class
@Entity
@Table(name = "test")
public class Test implements Serializable {
private long id;
@JsonSerialize(using = DateTimeSerializer.class)
private DateTime creationTimestamp; //joda datetime used in response body
@JsonIgnore //used in http header
private DateTime lastModofiedTimestamp;
@Id
@Column(name = "id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name = "creationTimestamp")
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
public DateTime getCreationTimestamp() {
return creationTimestamp;
}
public void setCreationTimestamp(DateTime creationTimestamp) {
this.creationTimestamp = creationTimestamp;
}
@Column(name = "lastmodifiedTimestamp")
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
public DateTime getLastModofiedTimestamp() {
return lastModofiedTimestamp;
}
public void setLastModofiedTimestamp(DateTime lastModofiedTimestamp) {
this.lastModofiedTimestamp = lastModofiedTimestamp;
}
}
如果我从填充 json 字段的 UI 传递一个正确的 creationTimestamp 值,hibernate 使用反序列化传递给插入 query.It 在此工作案例并在数据库中创建行
但我希望这个值不要从 UI 发送,如果 sent.This 用于创建调用则忽略
但是在 get 调用期间,我希望在对象中填充时间戳值
您可以使用 @Formula
而不是 @Column
来注释 creationTimestamp 字段,但在公式中使用相同的 creationTimestamp
。参见 for example
有个table
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`lastmodifiedTimestamp` DATETIME ON UPDATE CURRENT_TIMESTAMP,
`creationTimestamp` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `Unique` (`name`)
)
和一个实体 class,我将其用于 Json 转换以及数据库存储。 这里的问题是,当我尝试创建一个测试时,hibernate 给出了一个异常 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'creationTimestamp' cannot be null 但是我可以 运行 sql 查询而不传递时间戳 fields.How 我可以让休眠避免在插入查询中发送这些时间戳字段吗?
我不能将它们标记为瞬态,因为我在反序列化期间需要时间戳字段。当我获取测试对象时。
它无论如何给出 Caused by: javax.persistence.EntityNotFoundException: No row with the given identifier exists perhaps because both @Column and @Transient on the fields
下面是实体class
@Entity
@Table(name = "test")
public class Test implements Serializable {
private long id;
@JsonSerialize(using = DateTimeSerializer.class)
private DateTime creationTimestamp; //joda datetime used in response body
@JsonIgnore //used in http header
private DateTime lastModofiedTimestamp;
@Id
@Column(name = "id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name = "creationTimestamp")
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
public DateTime getCreationTimestamp() {
return creationTimestamp;
}
public void setCreationTimestamp(DateTime creationTimestamp) {
this.creationTimestamp = creationTimestamp;
}
@Column(name = "lastmodifiedTimestamp")
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
public DateTime getLastModofiedTimestamp() {
return lastModofiedTimestamp;
}
public void setLastModofiedTimestamp(DateTime lastModofiedTimestamp) {
this.lastModofiedTimestamp = lastModofiedTimestamp;
}
}
如果我从填充 json 字段的 UI 传递一个正确的 creationTimestamp 值,hibernate 使用反序列化传递给插入 query.It 在此工作案例并在数据库中创建行 但我希望这个值不要从 UI 发送,如果 sent.This 用于创建调用则忽略 但是在 get 调用期间,我希望在对象中填充时间戳值
您可以使用 @Formula
而不是 @Column
来注释 creationTimestamp 字段,但在公式中使用相同的 creationTimestamp
。参见 for example