2014-02-12 1 views
0

У меня есть объект, Item, который связан с другими элементами через таблицу соединений. Однако при сохранении связанного элемента мне нужно вставить значение «дополнительный экран».Как указать дополнительную информацию вставки для таблицы соединений?

Я использую данные весны JPA (1.4.1) для моей абстракции настойчивости. EclipseLink (2.5.0) - мой поставщик JPA.

@Entity 
public class Item { 

    // other fields and getters/setters omitted for clarity 

    @OneToMany 
    @JoinTable(name = "related_items_map", 
     joinColumns = @JoinColumn(name = "fk_item"), 
     inverseJoinColumns = @JoinColumn(name = "fk_related_item")) 
    private List<Item> relatedItems; 
} 

join table name = "related_items_map" with 
    columns = fk_item, fk_related_item, additionalField 

Моя конечная цель заключается в достижении следующей семантикой:

// obtain the items from service by id 
Item item = itemService.findOne(1); 
Item relatedItem = itemService.findOne(2); 

// add related item to item related list 
item.getRelatedItems().add(relatedItem); 

// save item using service 
itemService.save(item); 

Сегодня сгенерированный SQL выглядит правильно

INSERT INTO item (fk_item, fk_related_item) values (?, ?) => bind [1, 2] 

Единственная проблема в том, что колонка additionalField равна нулю. Значение, которое должно быть вставлено, должно быть рассчитано (на основе определенного состояния) во время выполнения до вставки.

Как настроить вставку для этой операции? Я знаю, как настраивать определенные классы, но не сопоставления.

==== ==== UPDATE

Как предложил Крис, я создал объект Обертывание "JoinTable"

@Entity 
@Table("related_items_map") 
public class RelatedItem { 
    @Id 
    private String itemId; 

    @Id 
    private String relatedItemId; 

    // ... other stuff 
} 

@Entity 
public class Item { 

    // other fields and getters/setters omitted for clarity 

    @OneToMany 
    @JoinTable(name = "related_items_map", 
     joinColumns = @JoinColumn(name = "fk_item")) 
    private List<RelatedItem> relatedItems; 
} 

Однако EclipseLink пытающегося сделать несколько вставки теперь, когда Я делаю следующее:

// obtain two items 
Item item = itemService.find(1); 
Item other = itemService.find(2); 

// create the joining 
RelatedItem relatedItem = new RelatedItem(); 
relatedItem.setItemId(item.getId()); 
relatedItem.setRelatedId(other.getId()); 

// add the relation to the list of relations 
item.getRelatedItems().add(relatedItem); 

// update the item. 
itemService.save(item); 

Я получаю ключ нарушение ограничения, потому что он пытается сделать две вставки:

INSERT INTO related_items_map(fk_item, fk_related_item, ...) values (?, ?, ...) => bind [1, 2, ...] 

INSERT INTO related_items_map(fk_item, fk_related_item) values (?, ?) => bind [1 ,2] 

Первая вставка, которую я предполагаю, потому что она создает реальный объект. Второе, что я предполагаю, связано с отношением OneToMany к классу Item. Как опустить эту вторую вставку?

+0

Если значение поля вычисляется из состояния сущности, зачем его нужно вставлять - может ли это состояние использоваться, когда нужно восстановить значение? – Chris

ответ

1

Если это поле не является каким-либо индексом или вы хотите использовать карту и использовать это поле в качестве ключа или значения, JPA разрешает отображение полей только внутри объектов.

Чтобы быть портативным без необходимости входить в специфику поставщика, вам необходимо создать объект для этой таблицы отношений. Это позволяет использовать поле в запросах и получать доступ, как и любое другое поле.

+0

Я сделал, как предложил, но столкнулся с проблемой. Я обновил исходный вопрос, так как раздел комментариев недостаточен. – predhme

+1

Таблица related_items_map больше не является таблицей объединений, а представляет собой таблицу Entity, и ее следует рассматривать как любые другие отношения 1: M. Вероятно, вы захотите иметь двунаправленный 1: M с помощью связанного с ним элемента, используя указатель обратной ссылки M: 1 в качестве его идентификатора, если вы используете JPA 2.0. См. Http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers для простого примера – Chris

+0

«больше не является таблицей соединений, а таблицей сущности» ... Ах да, это так верно. Спасибо за то, что я явно пропустил. – predhme