【问题标题】:Hibernate/JPA one-to-many relationship if parent reference is defined as an ID with no parent reference如果父引用被定义为没有父引用的 ID,则 Hibernate/JPA 一对多关系
【发布时间】:2014-02-21 20:53:35
【问题描述】:

在 Hibernate/JPA 中定义一对多关系的标准方法是在子对象中引用其父对象。

@Entity
@Table(name="PARENT")
public class Parent {
    // ...

    @OneToMany(mappedBy="department")
    private Set<Child> children;

    // ... 
}



@Entity
@Table(name="CHILD")
public class Child {
    // ...

    @ManyToOne
    @JoinColumn(name="parent_id")
    private Parent parent;

    // ... 
}

这种方法的问题是 Child 变成了重量级的类,更难通过网络发送等等。

是否可以在没有从 Child 引用的 Parent 对象并且没有额外的引用/连接表的情况下定义一对多关系?在这种情况下,子类定义如下:

@Entity
@Table(name="CHILD")
public class Child {
    // ...

    @Column(name="DEPARTMENT_ID")
    private Long departmentId;

    // ... 
}

【问题讨论】:

  • 当然,但是如果您实际上不想使用 ORM,为什么还要承担 ORM 的所有开销?
  • Parent 和 Child 都是复杂对象,我希望 ORM 的强大功能可以帮助我读写它们,但是一旦读取了 Parent,我希望能够将其子对象用作无需携带 Parent 的独立实体。
  • 不,你不能这样做 ORM 用于组成两个对象之间的引用完整性,所以你让它不那么重要。
  • nikpon,请删除您的编辑。这些名称是故意大写的,因为它们是类名。至于你的回答,不清楚你想说什么。如何保持完整性取决于开发人员。
  • 您不应该根据必须通过网络发送的内容来设计实体。您应该根据数据模型来设计它们。然后在您想通过网络发送实体时对其进行注释、调整或转换。例如,如果使用 Jackson 将其转换为 JSON,您可以添加 getParentId() getter,并使用 @JsonIgnore 注释父字段,并且父 ID 将通过网络而不是整个父对象发送。

标签: java hibernate jpa one-to-many


【解决方案1】:

如果您使用JPA 2.0,则OneToMany 单向可能在子实体中没有父实体。

父类.java

@Entity
@Table(name="PARENT")
public class Parent {
    @OneToMany
    @JoinColumn(name = "PARENT_ID", referencedColumnName = "ID")
    private Set<Child> children;
}

子.java

@Entity
@Table(name="CHILD")
public class Child {
    // No need to hold parent entity
    //@ManyToOne
    //@JoinColumn(name="parent_id")
    //private Parent parent;
}

More Reference

【讨论】:

  • 您的定义有问题。当您将子项添加到父项然后尝试保存父项时,您会得到无法将 NULL 插入 ("SCHEMA"."CHILD"."PARENT_ID") 的内容。这意味着 Hibernate 无法保存图形。不确定它是否可以读取,因为我需要至少保存一个实例才能读取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多