【问题标题】:Hibernate 4.2, JPA 2.0 Relationship OnetoMany Unidirectional with AnnotationsHibernate 4.2、JPA 2.0 关系 OnetoMany 单向带注释
【发布时间】:2016-02-27 21:52:57
【问题描述】:

我使用 Hibernate 4.2.21 开始我的第一个项目,首先使用 JPA 2.0,我想创建一个关系 OneToMany 单向。我在 Hibernate 3 的版本中看到了很多示例,但在 4.2.21 中却没有看到这个示例完美运行,但我不知道是否是一个好的做法,我想知道其他成员对此的意见吗?

一对多关系:

-父模板:

  @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name = "template_id") 
  private Set<Variable> variables = new LinkedHashSet<Variable>();

-子:变量

@Column(name = "template_id", nullable = false)
Integer templateId;

【问题讨论】:

  • 子级通常不应该有其父级的 ID。如果子节点需要知道其父节点,则改为使其成为双向关联。
  • 在我的情况下,孩子没有必要必须认识父亲,然后为了实施一个好的做法,只需要删除孩子中的引用?
  • 是的。 templateId 字段是不必要的。另请注意,尽管您使用 new LinkedHashSet() 初始化集合,但 Hibernate 不会使用该集合实现,也不会在任何地方保留插入顺序。所以不要期望集合中的变量在 Hibernate 加载的实体中以任何特定的顺序排列。
  • 好的,谢谢!还有关于 Collections 的问题.. 这是另一点,一些示例在另一个 List 中使用 Set,最佳做法是什么?
  • 当您需要保留顺序(使用索引列)时,列表是必需的。在其他情况下,Set 是一个更好的选择(除非你有一个表现不佳的 equals()/hasshCode() 实现:避免出现问题的最简单方法是避免覆盖这两个方法)。

标签: java oracle hibernate jpa jpa-2.0


【解决方案1】:

根据这个另一个帖子的。

Hibernate unidirectional one to many association - why is a join table better?

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-association-collections

在拥有的实体中使用外键列的单向一对多并不常见,也不推荐。我们强烈建议您对这种关联使用连接表(如下一节所述)。这种关联是通过@JoinColumn 描述的

@Entity
public class Customer implements Serializable {
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="CUST_ID")
    public Set<Ticket> getTickets() {
    ...
}

@Entity
public class Ticket implements Serializable {
    ... //no bidir
} 

单向连接表

最好使用带有连接表的单向一对多。这种关联是通过@JoinTable 来描述的。

@Entity
public class Trainer {
    @OneToMany
    @JoinTable(
            name="TrainedMonkeys",
            joinColumns = @JoinColumn( name="trainer_id"),
            inverseJoinColumns = @JoinColumn( name="monkey_id")
    )
    public Set<Monkey> getTrainedMonkeys() {
    ...
}

@Entity
public class Monkey {
    ... //no bidir
} 

最后它实现双向方法的唯一方法......是还是不是?

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2012-11-02
    相关资源
    最近更新 更多