【问题标题】:Field annotated with @Transient updated in database用 @Transient 注释的字段在数据库中更新
【发布时间】:2016-08-04 21:33:32
【问题描述】:

我有一个看起来像这样的实体:

@Entity
public class Candidate {

...
  @Transient
  private JobApplication mostRecentApplication
...
}

@Entity
public class JobApplication{
...
  @ManyToOne
  private Candidate candidate;
...
}

为了在将Candidate 作为json 对象返回时消除循环引用,我将Candidate 中包含的JobApplication 上的Candidate 设置为null。但是,当我坚持一个像这样更新的Candidate 时,它会用null Candidate 更新JobApplication,从而终止关联。这是一个错误还是我做错了什么?我的印象是 JPA 提供者应该忽略带有 @Transient. 注释的字段我正在使用带有 Spring Data 的 Hibernate。

【问题讨论】:

  • 如果您在事务上下文中将候选设置为 null,则更改将提交到数据库

标签: java hibernate jpa spring-data


【解决方案1】:

我在Candidate 中包含的JobApplication 上将Candidate 设置为null

问题是您可以随意将 mostRecentApplication 的值更改为您想要的任何值,但更改现有关系的属性可能会产生不利影响。

// change value to null
candidate.setMostRecentApplication( null );
// change value to a detached instance
candidate.setMostRecentApplication( new JobApplication(...) );

但是如果你执行以下操作,你可以观察到你所看到的

candidate.getMostRecentApplication().setSomeProperty( null );

在这种情况下,您不会更改mostRecentApplication,而是更改mostRecentApplicationsomeProperty 的状态。如果mostRecentApplication 不是一个分离的非托管实例,那么如果在事务上下文中,值将会改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多