繁体   English   中英

JPA实体未保留在我的额外字段中

[英]JPA entity is not persisted with my extra field

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和@PrePersist回调,它们将转换多余的列。 但是,当我保留数据对象时,状态值将保留,但多余的列(Data._extra)不会保留。 我做错了什么?

您定义的额外对象是@Transient 临时对象不会保存到数据库。

如果您真的想询问extra.a,那么@Abdullah G的答案是否正确。

但是,如果您输入错误,则可能是_extra字段。

Hibernate缓存刚刚保留的值,因此您在@PreUpdate回调中获取了一个缓存的旧对象。

更新我找到的解决方案是使用

@Column(name = "password", insertable = false, updatable = false)

而不是@Transient注释。 但是,它将在数据库中创建一列,该列始终为空。


您的保存方法-是否使用合并? 由于Extra是暂时的,因此它对于JPA是不可见的,并且不会合并到托管实例中。 因此,当调用preUpdate方法时,它将为null。 如果需要,您必须编写自己的save方法以合并临时值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM