У меня есть объект, 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. Как опустить эту вторую вставку?
Если значение поля вычисляется из состояния сущности, зачем его нужно вставлять - может ли это состояние использоваться, когда нужно восстановить значение? – Chris