Итак, во-первых, я не понимаю, почему вы использовали @ManyToMany
, потому что это для отношений n-to-n, а ваше на это не похоже.
Вы можете смоделировать parent- дочерние отношения двумя способами, наиболее эффективным является сопоставление ManyToOne, при котором дочерний элемент управляет внешним ключом для родительского элемента:
@Entity
public class Parent {
@Id
@GeneratedValue
private int id;
private int someField;
}
@Entity
public class Child {
@Id
@GeneratedValue
private int id;
private int someField;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "someField",
referencedColumnName = "someField",
unique = false,
updateable = false,
insertable = false)
private Parent parent;
}
Вы можете использовать запросы JPQL / Criteria для получения всего, что вам нужно.
Подробнее об ассоциациях ManyToOne . А здесь еще немного .
См. @ JoinColumn docs для атрибутов вроде 'unique', et c.
И если вы настаивайте на том, чтобы сделать наоборот, это тоже сработает:
@Entity
public class Parent {
@Id
@GeneratedValue
private int id;
private int someField;
@OneToMany(
// cascade = What operations do you want to cascade? Who is the owner of the relationship?
// orphanRemoval = Do you want to delete orphaned children?
)
@JoinColumn(name = "someField",
unique = false,
updateable = false,
insertable = false)
private List<Child> children = new ArrayList<>();
}
@Entity
public class Child {
@Id
@GeneratedValue
private int id;
private int someField;
}
Это однонаправленное отображение, но вы можете добавить «родительскую» ассоциацию к дочернему, если хотите. Затем вам нужно добавить методы, чтобы убедиться, что они синхронизированы ([см. Здесь]) 4
Если они не уникальны и внешнего ключа нет, я не уверен, что это будет работай. Но в этом случае вы можете использовать @JoinFormula
, чтобы предоставить запрос SQL для присоединения.