如何在Hibernate / JPA中实现“可选”关系?

时间:2014-02-04 02:19:51

标签: java hibernate jpa

我正在使用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)) ;

但是,已决定某些“父”记录不应包含“子”记录,我应该在0列中添加FOO.BAR_ID

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

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完成吗?

1 个答案:

答案 0 :(得分:0)

@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinColumn(name = "BAR_ID", nullable = false)

我相信你应该尝试删除。

nullable = false

你告诉hibernate,Foo的Bar不能为空。如果Bar是可选的,那么有时它必须为null。因为它不能为null并且CascadeType是Persist,所以Hibernate保存了Foo在保存Foo时必须具有的Bar。