Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA实体未与我的额外字段一起持久化_Java_Jpa - Fatal编程技术网

Java JPA实体未与我的额外字段一起持久化

Java JPA实体未与我的额外字段一起持久化,java,jpa,Java,Jpa,我想使用额外的字符串列作为额外的对象。 所以我做了@PostLoad、@PrePersist回调,它们转换额外的列。 但是,当我持久化数据对象时,状态值被持久化,但额外的列(data.\u extra)不会持久化。我做错了什么?您定义的额外对象是@Transient。瞬态对象不会保存到数据库中 您定义的额外对象是@Transient。瞬态对象不会保存到数据库中 如果你真的想问额外的.a,那么@Abdullah G的答案是正确的 但是,如果您输入了一个拼写错误,那么您可能指的是额外的\u字段 Hi

我想使用额外的字符串列作为额外的对象。 所以我做了@PostLoad、@PrePersist回调,它们转换额外的列。
但是,当我持久化数据对象时,状态值被持久化,但额外的列(data.\u extra)不会持久化。我做错了什么?

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

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

如果你真的想问额外的.a,那么@Abdullah G的答案是正确的

但是,如果您输入了一个拼写错误,那么您可能指的是额外的
\u
字段

Hibernate缓存刚刚被持久化的值,因此您将在@PreUpdate callback中获得一个缓存的旧对象

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

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);
而不是
@Transient
注释。但是,它会在数据库中创建一个始终为null的列



如果你真的想问额外的。a,那么@Abdullah G的答案是正确的

但是,如果您输入了一个拼写错误,那么您可能指的是额外的
\u
字段

Hibernate缓存刚刚被持久化的值,因此您将在@PreUpdate callback中获得一个缓存的旧对象

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

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);
而不是
@Transient
注释。但是,它会在数据库中创建一个始终为null的列



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

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

对不起,我是说额外的列。(_额外的数据成员)对不起,我是指额外的列。(_额外的数据成员)我无法理解。你的意思是prePersist()中的extra是旧对象吗?但是我使用data.getExtra().setA(1)设置了extra。怎么可能是..?@chaeyk数据对象本身很旧。您甚至可以在调试器中看到它。我发现了这个问题并检查了自己。当您第二次查看
extra
字段时,当
状态为
时,该字段不会更改。因此,在调用dataRepository.save(data)之前,我看到
extra
字段已更改,但当我在@PreUpdate中调试时,我无法理解。你的意思是prePersist()中的extra是旧对象吗?但是我使用data.getExtra().setA(1)设置了extra。怎么可能是..?@chaeyk数据对象本身很旧。您甚至可以在调试器中看到它。我发现了这个问题并检查了自己。当您第二次查看
extra
字段时,当
状态为
时,该字段不会更改。因此,在调用dataRepository.save(data)之前,我看到
extra
字段已更改,但当我在@PreUpdate中调试时,它不是。为什么不在额外映射上使用转换器,而不是使其暂时化?转换器将把它转换成字符串,而不是依赖preLoad和prePersist方法,并允许您删除_额外字段。现在,我正在使用转换器。现在我只是想知道为什么额外的列没有被持久化。为什么不在额外的映射上使用转换器,而不是使其暂时化?转换器将把它转换成字符串,而不是依赖preLoad和prePersist方法,并允许您删除_额外字段。现在,我正在使用转换器。现在我只是想知道为什么额外的列没有被持久化。