Java 区分JPA关系的拥有方和反向方,不带“;mappedBy“;
我对JPA/Hibernate和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
@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++);
}
}