2015-07-28 5 views
0

У меня есть объект со следующим отображением определенным:ли обновление вместо удаления/вставки для @ElementCollection Карты

@ElementCollection(fetch=FetchType.LAZY, targetClass=MyEntityTranslations.class) 
@CollectionTable(name="MY_ENTITY_TRANSLATIONS", [email protected](name="PARENT_ID")) 
@MapKeyColumn(name="LOCALE") 
private Map<String, MyEntityTranslations> translations; 

MyEntityTranslations класса выглядит следующим образом:

@Embeddable 
public class MyEntityTranslations 
{ 
    @Column(name="NAME") 
    private String name; 
    @Column(name="DESCRIPTION") 
    private String description; 

    public MyEntityTranslations() 
    { 
    } 

    //getters and setters 
} 

Таблица MY_ENTITY_TRANSLATIONS выглядит это:

CREATE TABLE MY_ENTITY_TRANSLATIONS 
(
    parent_id bigint NOT NULL, 
    locale character varying NOT NULL, 
    name character varying, 
    description character varying, 
    CONSTRAINT my_entity_translations_pkey PRIMARY KEY (parent_id, locale) 
); 

Все работает нормально и, как ожидалось, но когда я обновите имя или описание в MyEntityTranslations, он делает DELETE, а затем INSERT вместо UPDATE.

Я подумал, может быть, добавив equals() и hashCode() методам в MyEntityTranslations позволит JPA знать, нужно ли просто обновлять его. Тем не менее, я быстро понял, что у меня нет необходимой информации в MyEntityTranslations, чтобы правильно переопределить эти методы.

После прибегая к помощи вокруг этого вопроса, я нашел много мест для этой проблемы с List, с решением существа добавления @OrderColumn аннотацию или изменить его на Set. Тем не менее, я ничего не мог найти об этом для Map.

Действительно, после внесения записи в таблицу MY_ENTITY_TRANSLATIONS ее никогда не нужно удалять, если только объект с идентификатором, равным столбцу PARENT_ID, не удаляется. Есть ли что-нибудь, что я могу сделать с сущностью или встраиваемой версией, которая позволит JPA всегда делать UPDATE вместо поведения DELETE/INSERT?

В случае, если это имеет значение, я использую PostgreSQL, Spring Data JPA и EclipseLink.

+0

Вы должны упомянуть своего поставщика JPA - поскольку эта проблема специфична для реализации. –

+0

@TobiasLiefke Я обновил вопрос с этой информацией (EclipseLink). – dnc253

ответ

0

В качестве первичного ключа вы используете как parent_id, так и locale, но нет возможности сообщить JPA, что информация с Embeddable: Update требует, чтобы конструкции имели что-то, что однозначно идентифицирует их, чтобы JPA отличала их от друг друга и отслеживание изменений. Встраиваемая - это полная противоположность этому, заявляя, что эти конструкции не имеют собственного идентификатора и поэтому используют только их идентификатор родителей.

Что вы должны сделать, это сделать MyEntityTranslations сущностью, использующей поля parent_id, locale в качестве первичного ключа, чтобы ваша модель соответствовала тем, что вы настроили в базе данных.

+0

Я понимаю, что вы говорите, но я надеялся избежать того, что MyEntityTranslations будет сущностью. Переводы существуют только как часть объекта, и я хочу, чтобы сущность отвечала за заполнение карты. Есть ли что-то, кроме @Embeddable, которое я могу использовать для MyEntityTranslations? – dnc253

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