Java 区分JPA关系的拥有方和反向方,不带“;mappedBy“;

Java 区分JPA关系的拥有方和反向方,不带“;mappedBy“;,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我对JPA/Hibernate和@OneToMany与@OrderColumn的映射有问题。我发现这可能是一个关系的问题 但是 我如何告诉JPA/Hibernate拥有哪一方? 我试过了 @OneToMany @OrderColumn(...) @JoinTable(name="...") 但这没用 它似乎是一个(尝试过的Hibernate 3.6.1和3.6.9)。另一家JPA提供商(如EclipseLink)是否支持mappedBy和@OrderColumn的组合?作为对问题变化的回应,D

我对JPA/Hibernate和
@OneToMany
@OrderColumn
的映射有问题。我发现这可能是一个关系的问题

但是

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

我试过了

@OneToMany
@OrderColumn(...)
@JoinTable(name="...")
但这没用


它似乎是一个(尝试过的Hibernate 3.6.1和3.6.9)。另一家JPA提供商(如EclipseLink)是否支持
mappedBy
@OrderColumn
的组合?

作为对问题变化的回应,DataNucleus JPA支持这种组合,根据
只需将该示例中的@OrderId替换为@OrderColumn

,最后我找到了将
位置
放入对象应排序的类(
任务
)的解决方法

@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++);
  }
}
@实体
公共类任务列表扩展了GenericModel{
@OneToMany(mappedBy=“taskList”,cascade=CascadeType.ALL,orphan=true)
@订购人(“职位”)
public List tasks=new ArrayList();
公共void addTask(整数位置,任务){
task.taskList=this;
任务。添加(职位、任务);
更新位置();
}
私有void updatePositions(){
int位置=0;
for(Whish-Whish:Whish)
whish.setPosition(position++);
}
}

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

我已经将这个问题与我的问题联系起来了。我的问题不是重复的,而是添加的。JPA中的“mappedBy”是为了使这种关系具有双向性。省略它意味着它是单向的,因此“拥有”是不言而喻的。@deamon JPA规范要求“mappedBy”将关系标记为双向的。事实(在Hibernate中)什么“起作用”或其他方式是另一个问题。OrderColumn是将列表作为“索引”而不是使用一些“ORDERBY”子句,即单独的概念。DataNucleus JPA当然允许双向索引列表您尝试了什么版本的Hibernate?看起来他们最初对规范的解释是错误的,但后来承认了他们的错误。这是很久以前的事了,所以你会认为它现在已经实现了@DataNucleus你知道这是否包含在TCK中吗?@Mike抱歉,我不知道它是否在JPA2 TCK中;TCK当然是保密的,尽管满足了DataNucleus项目的所有要求和管理,Oracle还是阻止了DataNucleus项目的访问。我们只能希望他们通过JPA2.1改进这一点,并提供一个开源TCK,这样每个人都可以检查合规性,这样人们就可以更好地决定在他们的项目中使用什么
@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++);
  }
}