简体   繁体   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);

I want to use extra string column as Extra object. 我想使用额外的字符串列作为Extra对象。 So I made @PostLoad, @PrePersist callbacks, which are converting extra column. 因此,我进行了@PostLoad和@PrePersist回调,它们将转换多余的列。 But, when I persist data object, state value is persisted, but extra column (Data._extra) is not persisted. 但是,当我保留数据对象时,状态值将保留,但多余的列(Data._extra)不会保留。 What did I do wrong? 我做错了什么?

Your defined extra object is @Transient . 您定义的额外对象是@Transient Transient objects aren't saved to DB. 临时对象不会保存到数据库。

If you really meant to ask about extra.a then the answer of @Abdullah G if right. 如果您真的想询问extra.a,那么@Abdullah G的答案是否正确。

But if you made a typo then you probably meant _extra field. 但是,如果您输入错误,则可能是_extra字段。

Hibernate caches the value just being persisted so you're getting a cached old object in @PreUpdate callback. Hibernate缓存刚刚保留的值,因此您在@PreUpdate回调中获取了一个缓存的旧对象。

UPDATE The solution I've found is to use 更新我找到的解决方案是使用

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

instead of @Transient annotation. 而不是@Transient注释。 However, it creates a column in the database that is always null. 但是,它将在数据库中创建一列,该列始终为空。


Your save method - is it using merge? 您的保存方法-是否使用合并? Since Extra is transient, it is invisible to JPA and would not be merged into the managed instance. 由于Extra是暂时的,因此它对于JPA是不可见的,并且不会合并到托管实例中。 So it will be null when the preUpdate method is called. 因此,当调用preUpdate方法时,它将为null。 you'll have to write your own save method to merge in transient values if you need them. 如果需要,您必须编写自己的save方法以合并临时值。

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

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