class Extra {
int a;
}
@Entity
@Table(name = "data_table")
@Data
class Data {
@Column int state;
@Column(name = "extra") String _extra;
@Transient Extra extra;
@PostLoad
void preLoad() {
extra = mapper.readValue(_extra, Extra.class);
}
@PrePersist
@PreUpdate
void prePersist() {
_extra = mapper.writeValueAsString(extra);
}
}
Data data = jpaRepository.findOne(...);
data.setState(1);
data.getExtra().setA(1);
jpaRepository.save(data);
我想使用额外的字符串列作为Extra对象。 所以我制作了@PostLoad,@ Prefersist回调,它正在转换额外的列。 但是,当我持久保存数据对象时,状态值会保持不变,但是不会保留额外的列(Data._extra)。我做错了什么?
答案 0 :(得分:2)
您定义的额外对象为@Transient
。瞬态对象不会保存到DB。
答案 1 :(得分:1)
如果你真的想询问extra.a,那么@Abdullah G的回答是正确的。
但是如果你输错了,那么你可能意味着_extra
字段。
Hibernate缓存刚刚持久化的值,以便在@PreUpdate回调中获取缓存的旧对象。
更新我找到的解决方案是使用
@Column(name = "password", insertable = false, updatable = false)
而不是@Transient
注释。但是,它会在数据库中创建一个始终为null的列。
答案 2 :(得分:1)
您的保存方法 - 是否使用合并?由于Extra是瞬态的,因此它对JPA是不可见的,不会合并到托管实例中。所以当调用preUpdate方法时它将为null。如果需要,你必须编写自己的保存方法来合并瞬态值。