【问题标题】:How do I implement an "optional" relationship in Hibernate/JPA?如何在 Hibernate/JPA 中实现“可选”关系?
【发布时间】:2014-02-04 02:19:51
【问题描述】:

我正在使用 JPA 的 Hibernate 3.6 实现。我在逻辑父子关系中有两个表。通常,对于“父”中的每条记录,“子”中都会有一个记录。表格如下所示:

CREATE TABLE FOO (
  FOO_ID INT IDENTITY,
  BAR_ID INT DEFAULT 0 NOT NULL,
  SOMEDATA CHAR(50) );

CREATE TABLE BAR (
  BAR_ID INT IDENTITY,
  OTHERDATA CHAR(50),
  STILLOTHER CHAR(50)) ;

但是,已经决定一些“父”记录不应该有“子”记录,我应该在FOO.BAR_ID 列中添加一个0

如何在我的实体类中实现这一点?现在这些类看起来像这样:

public class Foo implements java.io.Serializable {
    @Id
    @GeneratedValue
    @Column(name = "FOO_ID", unique = true, nullable = false)
    private Long fooId;
    @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinColumn(name = "BAR_ID", nullable = false)
    private Bar bar;
    }


public class Bar implements java.io.Serializable {
    @Id
    @GeneratedValue
    @Column(name = "BAR_ID", unique = true, nullable = false)
    private Long barId;

)

我似乎找不到将0 放入FOO.BAR_ID 列的正确语法,而不是尝试在BAR 表中创建记录。这甚至可以用 Hibernate 完成吗?

【问题讨论】:

  • 为什么是 0?只需输入 null 就可以了。

标签: java hibernate jpa


【解决方案1】:
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinColumn(name = "BAR_ID", nullable = false)

我认为您应该尝试删除。

nullable = false

你告诉 hibernate Foo 的 Bar 不能为空。如果 Bar 是可选的,那么有时它必须为空。由于不能为空且 CascadeType 为 Persist,因此 Hibernate 正在保存 Foo 在保存 Foo 时必须具有的 Bar。

【讨论】:

  • 所以。 . .解决办法是什么?
猜你喜欢
  • 1970-01-01
  • 2021-05-22
  • 2016-04-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多