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