【问题标题】:Distinguish owning and inverse side of a JPA relationship without "mappedBy"在没有“mappedBy”的情况下区分 JPA 关系的拥有和反面
【发布时间】:2012-01-08 22:13:34
【问题描述】:

我在使用 JPA/Hibernate 以及 @OneToMany@OrderColumn 的映射时遇到问题。而且我发现这可能是missing distinction between the "owning" and the "inverse" side的关系问题。

但是Hibernate does not support the following combination

@OneToMany(mappedBy="...")
@OrderColumn(...)

我如何告诉 JPA/Hibernate 拥有方是哪一方?

我试过了

@OneToMany
@OrderColumn(...)
@JoinTable(name="...")

但它没有帮助。

好像是Hibernate bug(试过Hibernate 3.6.1和3.6.9)。 EclipseLink 等其他 JPA 提供程序是否支持 mappedBy@OrderColumn 的组合?

【问题讨论】:

  • 我已经把这个问题联系起来了。我的问题不是重复,而是补充。
  • JPA 中的 "mappedBy" 是为了使关系成为双向的。省略它意味着它是单向的,因此“拥有”是不言而喻的。
  • @deamon JPA 规范要求“mappedBy”将关系标记为双向。事实。什么“有效”或以其他方式(在 Hibernate 中)是一个不同的问题。 OrderColumn 是将 List 作为“索引”而不是使用某些“order by”子句,即一个单独的概念。 DataNucleus JPA 当然允许双向索引列表
  • 您尝试了哪个版本的 Hibernate?似乎他们最初错误地解释了规范,但后来承认了他们的错误。这是很久以前的事了,所以你会认为它现在已经实现了。 @DataNucleus 你知道这是否被 TCK 覆盖吗?
  • @Mike 抱歉,我不知道它是否在 JPA2 TCK 中; TCK 当然是秘密的,尽管满足了他们的所有要求和管理,Oracle 还是阻止了 DataNucleus 项目的访问。我们只能希望他们通过 JPA2.1 改进这一点,并提供一个开源 TCK,以便每个人都可以检查合规性,然后人们就可以更好地决定为他们的项目使用什么

标签: java hibernate jpa orm


【解决方案1】:

针对问题的变化,DataNucleus JPA支持这样的组合,根据http://www.datanucleus.org/products/accessplatform_3_0/jpa/orm/one_to_many_list.html#join_bi 只需将该示例中的@OrderId 替换为@OrderColumn

【讨论】:

    【解决方案2】:

    最后,我找到了将position 放入应该对其对象进行排序的类 (Task) 中的解决方法。

    @Entity
    public class TaskList extends GenericModel {
    
      @OneToMany(mappedBy="taskList", cascade=CascadeType.ALL, orphanRemoval=true)
      @OrderBy("position")
      public List<Task> tasks = new ArrayList<>();
    
      public void addTask(int position, task) {
        task.taskList = this;
        tasks.add(position, task);
        updatePositions();
      }
    
      private void updatePositions() {
        int position = 0;
        for(Whish whish : whishes)
          whish.setPosition(position++);
      }
    }
    

    也许其他 JPA 提供商在这种情况下做得更好,但我现在必须坚持使用 Hibernate。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-03
      • 2012-06-13
      • 2017-01-23
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      相关资源
      最近更新 更多