Поддерживается ли @ManyToMany(mappedBy = ...) + @OrderColumn JPA?
у меня есть сущность, отображаемая следующим образом:
@Entity
@Table(name = "Groups")
@IdClass(value = GroupId.class)
public class Group implements Serializable
{
@Id
@Column(name = "round_id")
private Integer roundId;
@Id
@Column(name = "ordinal_nbr")
private Integer ordinalNbr = 0;
...
}
он имеет составной ключ (round_id, ordinal_nbr)
для указания порядка групп в раунде.
теперь представьте таблицу соединений, содержащую сущности, которые связывают упорядоченные группы с помощью собственной ссылки (от группы к группе):
CREATE TABLE GroupLinks
(
parent_round_id INTEGER NOT NULL,
parent_ordinal_nbr SMALLINT NOT NULL,
child_round_id INTEGER NOT NULL,
child_ordinal_nbr SMALLINT NOT NULL,
PRIMARY KEY (parent_round_id, parent_ordinal_nbr, child_round_id, child_ordinal_nbr),
FOREIGN KEY (parent_round_id, parent_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr),
FOREIGN KEY (child_round_id, child_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr)
);
я знаю, что это можно отобразить @ManyToMany
+ @JoinTable
+ @OrderColumn
для объекта-владельца (в зависимости от того, выберите):
@ManyToMany
@JoinTable(name = "GroupLinks", joinColumns = {@JoinColumn(name = "parent_round_id", referencedColumnName = "round_id"), @JoinColumn(name = "parent_ordinal_nbr", referencedColumnName = "ordinal_nbr")}, inverseJoinColumns = {@JoinColumn(name = "child_round_id", referencedColumnName = "round_id"), @JoinColumn(name = "child_ordinal_nbr", referencedColumnName = "ordinal_nbr")})
@OrderColumn(name = "child_ordinal_nbr")
private List<Group> children;
вопрос:
для принадлежащей стороны поддерживается сопоставление @ManyToMany(mappedBy = ...)
обратная связь с @OrderColumn
тоже?
@ManyToMany(mappedBy = "parents")
@OrderColumn(name = "parent_ordinal_nbr")
private List<Group> parents;
определяет ли спецификация JPA 2 разрешить или запретить это?
спасибо
обновление 1:
вышеизложенное по существу является структурой графика. Вот пример:
на GroupLinks
таблица содержит коробку лиц. При взгляде на B2
2 ответов
на javadoc или OrderColumn имеет информацию, которую вы ищете:
аннотация OrderColumn указывается на стороне связь, которая ссылается на коллекцию, которая должна быть упорядочена. Этот столбец order не отображается как часть состояния объекта или встраиваемый класс.
аннотация OrderBy должна использоваться для упорядочивания, которое отображается как постоянное состояние и поддерживается приложением. Предложение Orderby аннотация не используется при указании OrderColumn.
OrderColumn используется для добавления дополнительного столбца в таблицу соединений, используемую для поддержания порядка списка. Столбец order, как указано в javadoc, не является частью состояния сущности. В вашем случае, похоже, вы хотите упорядочить элементы в списке по одному из их постоянных свойств. В этом случае вы должны использовать аннотацию OrderBy (или иметь геттер, который сортирует список перед его возвратом).
в OPENJPA есть проблема, касающаяся @OrderColumn, операция извлечения работает, но сохранение сущности получает ошибку "отдельный объект", эта ошибка связана с добавлением этой аннотации (@OrderColumn)
решение состоит в том, чтобы использовать компаратор в родителе.класс getChildEntity для заказа дочернего списка сущностей, таким образом, это позволяет избежать использования @OrderColumn.
Collections.sort(this.child, new Comparator<class_type>() {
@Override
public int compare(class_type p1, class_type p2) {
return (int) (p1.getId() - p2.getId());
}
});
Решено:) John V, Col