【问题标题】:In Hibernate how to ignore a property only during serialization and not in deserialization在 Hibernate 中,如何仅在序列化期间而不是在反序列化中忽略属性
【发布时间】:2015-09-24 01:29:51
【问题描述】:

有一张桌子

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`)
)

和我用于 Json 转换以及数据库存储的实体类。 这里的问题是,当我尝试创建一个测试休眠给出一个异常 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'creationTimestamp' cannot be null 但是我可以在不传递时间戳字段的情况下运行 sql 查询。如何让休眠避免在插入查询中发送这些时间戳字段?

我无法将它们标记为瞬态,因为我在反序列化过程中需要时间戳字段。当我获取测试对象时。

它无论如何都会给出原因:javax.persistence.EntityNotFoundException:不存在具有给定标识符的行可能是因为字段上的@Column和@Transient

下面是实体类

@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;
  }
}

如果我从 UI 中传递适当的 creationTimestamp 值,该值填充 json 反序列化的字段,hibernate 使用它传递给插入查询。它在这种情况下工作并在数据库中创建行 但我希望这个值不要从 UI 发送,如果发送则忽略。这是用于创建调用 但是在 get 调用期间,我希望将时间戳值填充到对象中

【问题讨论】:

  • 这是另一个例子,说明为什么混合实体和 DTO 不是一个好主意。看到这个question and answer
  • stackoverflow.com/questions/1440952/… 在这里我读到了相反的内容以及如何使用单独的 DTO 解决这个问题,因为我需要在 get 调用中发送字段但需要在 put 期间保留自动生成的值(不是发送的)?我觉得使用@Formula 并没有那么复杂
  • 如果您不拆分实体和 DTO,您遇到的“问题”将是您将面临的许多问题中的第一个。相信我,我们学习了 300 多个实体类,然后才意识到我们必须拆分功能,这是一个痛苦的练习。
  • 哦,你提到的问题是 2009 年的!早在今天使用的许多 Hibernate 和 JSON 特定注释发明之前。
  • 您是否考虑过自己控制对象的序列化而不是使用默认的 java 序列化?发送序列化/反序列化不是 JPA/Hibernate 问题。如果您希望 JPA 不插入/更新字段,请将其标记为可更新=false、可插入=false,使其为只读。

标签: java json hibernate jpa jodatime


【解决方案1】:

您可以使用@Formula 而不是@Column 来注释creationTimestamp 字段,但在公式中使用相同的creationTimestamp。见for example

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2017-06-04
    • 2012-09-12
    • 1970-01-01
    • 2017-03-07
    相关资源
    最近更新 更多