2012-03-31 3 views
8

У меня есть объект отображается следующим образом:Является ли @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:

выше, по существу, график структуры. Вот пример:

IMAGE

Таблица GroupLinks содержит в штучной упаковке объектов. Если посмотреть только на объект B2 Group, список parents будет содержать (a,1,b,2) и (a,2,b,2). Что касается списка children, он будет содержать (b,2,c,1), (b,2,c,2) и (b,2,c,3).

Как вы можете видеть объекты в списках B2 не сталкивающихся, так что @OrderColumn должно работать нормально для обоих отношенийparents и children - по крайней мере, в теории. Но какова практика здесь (JPA)?

Обратите внимание: это просто попытка использования Hibernate и/или EclipseLink на самом деле не отвечает на вопрос, должен ли поддерживать или поддерживать этот сценарий спецификатор JPA 2 или JPA-совместимый поставщик.


Обновление 2:

Попытка вышеуказанные отображения по результатам Hibernate в следующем за исключением отображения:

Caused by: org.hibernate.MappingException: Repeated column in mapping for collection: com.kawoolutions.bbstats.model.Group.parents column: parent_ordinal_nbr 
    at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:340) 
    at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:363) 
    at org.hibernate.mapping.Collection.validate(Collection.java:320) 
    at org.hibernate.mapping.IndexedCollection.validate(IndexedCollection.java:89) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1291) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1729) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) 
    ... 9 more 

Извлечение @OrderColumn для parent_ordinal_nbr результатов в том же исключения для children отношений , Похоже, что Hibernate не любит колонки заказов, которые также используются во внешних ключах.


Update 3:

Испытано с EclipseLink на GlassFish ... это работает, не картографирования исключений.

Возникают два вопроса: Followup

  1. DISALLOW ли JPA столбцов внешнего ключа порядка? Это не имеет для меня смысла, почему они не должны просто работать ...
  2. Является ли это ошибкой в ​​спящем режиме?

ответ

6

The javadoc or OrderColumn имеет информацию, которую вы ищете:

OrderColumn аннотацию указан на стороне отношений, которая ссылается на коллекцию, которая должна быть заказана. Столбец не отображается как часть состояния объекта или встраиваемый класс.

Аннотацию OrderBy следует использовать для заказа, которая видна как постоянное состояние и поддерживается приложением. Аннотации OrderBy не используются, если указан OrderColumn.

OrderColumn используется для добавления дополнительного столбца в таблицу соединений, используемого для поддержания порядка списка. Столбец порядка, как указано в javadoc, не является частью состояния объекта. В вашем случае, кажется, вы хотите упорядочить элементы в списке одним из своих постоянных свойств. В этом случае вы должны использовать аннотацию OrderBy (или иметь getter, который сортирует список перед его возвратом).

+0

Вне зависимости от состояния субъекта означает ... Followup вопрос здесь: http://stackoverflow.com/questions/10054400/jpa-ordercolumn-and- visible-state-of-entity – Kawu

+0

Хорошее объяснение. Поистине показывает разницу между OrderColumn и OrderBy. +1 –

0

В OpenJPA есть проблема относительно @OrderColumn, восстановленные файлы операция работает, но экономия объекта получает ошибку «отдельностоящий объект», эта ошибка связана с добавлением этой аннотации (@OrderColumn)

Решением для использования компаратора в классе parent.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

Смежные вопросы