2014-01-08 4 views
2

У меня возникла проблема с вставкой элементов в @ElementCollection, представленных картой. При вставке элементов с одинаковыми значениями они не сохраняются. следущие @Entity и ее @Embeddable:@ElementCollection Карта @Embeddable не сохраняется, когда значения поля равны

@Entity 
@Table(name = "category", catalog = "my_db", schema = "") 
public class Category implements Serializable { 

    @Id 
    @Column(name = "id") 
    private Integer id; 

    @ElementCollection(fetch = FetchType.LAZY, targetClass = CategoryLabels.class) 
    @CollectionTable(name = "category_labels", joinColumns = 
    @JoinColumn(name = "category_id"), catalog = "my_db") 
    @MapKeyColumn(name = "language_id") 
    private Map<Integer, CategoryLabels> labels = new HashMap<Integer, CategoryLabels>(); 

... 
} 


@Embeddable 
public class CategoryLabels implements Serializable { 
    @Column(name = "label1") 
    private String label1; 

    @Column(name = "label2") 
    private String label2; 

... 
} 

записей базы данных

+-------------+-------------+-----------+---------+ 
| category_id | language_id | label1 | label2 | 
+-------------+-------------+-----------+---------+ 
|   183 |   1 | Capacity | Timings | 
|   183 |   2 |   |   | 
+-------------+-------------+-----------+---------+ 

Установка работает нормально, если label1 и LABEL2 различаются для каждой записи карты (как показано выше).

Но если я добавлю одну запись, которая имеет одинаковые значения для label1 и label2 как другую запись, вторая - , никогда не сохранялась в базе данных. Например, если я добавлю запись на карту с пустыми названиями меток (как и вторая запись в примере), но с language_id = 3, это никогда не будет сохраняться.

Я знаю об этой общей проблеме: http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection#Common_Problems и что внедренные объекты без идентификатора проверяются для своих полей и внешнего ключа @JoinColumns в качестве идентификатора. В моем случае это не работает, внешний ключ в @JoinColumn полностью игнорируется для проверки ID.

Это ошибка в Eclipselink или я что-то не так?

EDIT:

Я установил -Declipselink.logging.level=FINEST и это показывает, что никакие SQLs не выполняется для второго и последующих записей с пустыми этикетками.

Кроме того, я сделал образец проект, с которым вы можете воспроизвести проблему: http://bit.ly/1bR8ywO

ответ

1

Просто испытаны снова, и я обнаружил, что проблема посвящена управлению транзакциями. Я вообще не хотел использовать транзакции, поэтому я аннотировал свой SLSB @TransactionManagement(TransactionManagementType.BEAN). Когда я удаляю это, транзакция управляется контейнером, а затем обновление работает, как ожидалось.

Установка управления транзакциями в управляемый контейнер не является решением, на которое я надеялся, но сейчас это работает. Тем не менее, я думаю, что это ошибка в eclipselink.