1

更新:我通过相反的方式“解决”了这个问题!我现在将实体引用字段设置为只读(insertable=false updatable=false),外键字段为读写。这意味着我在保存新实体时需要特别小心,但在查询时,实体属性会为我解析。


我在我的域模型中有一个双向的一对多关联,其中我使用 JPA 注释和 Hibernate 作为持久性提供程序。这几乎是您的沼泽标准父/子配置,不同之处在于我想将父的外键作为子的单独属性与对父实例的引用一起公开,如下所示:

@Entity
public class Child {
    @Id @GeneratedValue
    Long id;

    @Column(name="parent_id", insertable=false, updatable=false)
    private Long parentId;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="parent_id")
    private Parent parent;

    private long timestamp;
}

@Entity
public class Parent {
    @Id @GeneratedValue
    Long id;

    @OrderBy("timestamp")
    @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<Child> children;
}

这在大多数情况下都可以正常工作,但是在很多(遗留)情况下,我想在 parent_id 列中放置一个无效值,而不必先创建一个虚假的 Parent。

不幸的是,由于 ,Hibernate 不会保存分配给该parentId字段的值insertable=false, updatable=false,当同一列映射到多个属性时,它需要它。有什么好方法可以“在 Hibernate 的背后”并将值潜入该字段,而无需下拉到 JDBC 或实现拦截器?

谢谢!

4

2 回答 2

1

假父母有什么问题?有一种巧妙的方法可以在一个地方做到这一点:

public void setParent(Parent parent) {
    this.parent = parent;
    this.parentId = parent == null ? null : parent.getId();
}

public void setParentId(Long parentId) {
    final Parent parent;
    if (parentId == null) {
        parent = null;
    } else {
        parent = new Parent();
        parent.setId(parentId);
    }
    setParent(parent);
}
于 2010-02-27T16:54:46.563 回答
0

您是否考虑过在孩子 inverse=true 上设置 ManyToOne,而不是告诉属性值不可插入/可更新?如果 inverse=true 像以前那样做,它将使 Child 实体“不是关系的真实来源”。它仍然会读取该列,但不会写入它。我认为。我已经有一段时间没有遇到这种情况了。

于 2010-02-27T04:10:11.643 回答