【问题标题】:Hibernate @OneToOne with updatable = false still updatingHibernate @OneToOne with updatable = false 仍在更新
【发布时间】:2015-09-03 15:42:53
【问题描述】:

我有一个休眠托管实体:

@Entity
public class Parent  {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

// (omitted useless details)

@OneToOne
@JoinColumn(name = "child_id", updatable = false)
private Child child;

// (omitted useless details)
}

--

@Entity
public class Child {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// (omitted rest...this is a POJO)
}

由于Child 的更新责任在其他地方管理,我的目标是在保存父级时简单地更新子级。不幸的是,@JoinColumn 上的这个 updatable = false 似乎被忽略了,从而保存了对父子节点所做的任何更改。

我怎样才能在一对一的关系中只保存父母?

感谢任何帮助。

编辑:澄清一下,Child 类也是一个@Entity,但是一个简单的 POJO。 Parent 和 Child 之间的关系是从 parent 单向的。

【问题讨论】:

  • 您是否尝试在JoinColumn 注释中将insertable 属性设置为false
  • 是的,我将它们都添加为测试,但仍然没有骰子。孩子仍在更新:(
  • Parent和Child的关系是单向还是双向?可以更新一下chie的代码吗?
  • @Prera​​kTiwari 关系从父级是单向的。我已经为孩子添加了代码,但它只是一个 POJO——那里没什么特别的。
  • 明确一点:当您保存父级时,子级上的字段会持续存在?

标签: java hibernate one-to-one


【解决方案1】:

我对此研究了很长时间,并查看了 @JoinColumn 注释的文档以及它所说的可更新/可插入属性...

"(可选)列是否包含在持久性提供程序生成的 SQL UPDATE 语句中。"

这意味着设置 updatable = false 只会阻止外键被更新(包括列)。当您保存父实体时,它还将保存附加到对象的所有子实体。

这意味着在您保存时附加到父实体的任何子属性也将被持久化。如果其他人可能已经更新了这个子实体,这会带来另一个问题,但是因为您正在保存父实体并附加了子实体,您将在不知不觉中覆盖对子对象所做的任何更改。

解决方案:

AFAIK 解决此问题的唯一方法是认真对待您保存的对象,除非您确实需要保存/更新不需要的子实体。保持你的对象自包含,这是惰性/急切加载属性和保存相同对象图的缺点。您也可以像另一位发帖人所说的那样,在保存之前将子实体设置为 null 以防止任何更新,但很容易被错过。

如果您可以保存整个对象树(父实体和子实体),您可以添加一个利用 @Version 属性来引入乐观并发的属性。这样,如果任何实体被其他人更新并且您尝试保存旧版本,它将失败。

@Version
@Column(name=”version”)
private long version;
public long getVersion() { return version; }

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2017-06-20
    • 2021-08-05
    • 2012-09-21
    • 2015-02-13
    • 2020-03-18
    • 2013-04-10
    • 2014-03-14
    • 2021-02-07
    相关资源
    最近更新 更多