我的额外字段不会保留JPA实体

时间:2017-06-21 07:31:33

标签: java jpa

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)。我做错了什么?

3 个答案:

答案 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。如果需要,你必须编写自己的保存方法来合并瞬态值。