2016-09-06 2 views
0

У меня есть класс сущностей, который просто ManyToMany с дополнительной колонкой следующим образом:Запоминание ManyToMany с дополнительной колонкой с помощью слияния метода

@Entity 
@Table(name = "view_templates_device_types") 
public class ViewTemplateDeviceTypeEntity implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "view_template_id") 
    private ViewTemplateEntity viewTemplate; 

    @Id 
    @ManyToOne 
    @JoinColumn(name = "device_type_id") 
    private DeviceTypeEntity deviceType; 

    @Column(name = "priority", nullable = false) 
    private int priority; 

    public ViewTemplateDeviceTypeEntity() { 

    } 
    ... 
} 

Я заметил, что когда я создаю новый объект этого типа, установите viewTemplate и deviceType к значениям, которые имеют соответствующие данные в db, и я вызываю entityManager.persist(entity), данные сохраняются. Но когда я называю entityManager.merge(entity) вместо persist я получаю исключение:

SQL Error: 1048, SQLState: 23000
Column 'view_template_id' cannot be null

Я думал, что вызов слияния должен привести данные, вставленные в базу данных в случае, если он еще не сохранен. Для меня очень важно использовать merge здесь (из-за каскадов). Что я могу сделать, чтобы он работал?

+0

и ваш '@ IdClass'? –

+0

Попробуйте определить 'foreignKey = @ForeignKey (name =" constraint ")' в '@ JoinColumn'. –

+0

@BillyFrost У меня нет причины '@ IdClass', это кажется необязательным. Как я сказал, «упорство» отлично работает. – AjMeen

ответ

0

Согласно спецификации JPA, раздел 2,4 "A composite primary key must correspond to either a single persistent field or property or to a set of such fields or properties as described below. A primary key class must be defined to represent a composite primary key. Composite primary keys typically arise when mapping from legacy databases when the database key is comprised of several columns. The EmbeddedId or IdClass annotation is used to denote a composite primary key. See Sections 11.1.17 and 11.1.22.".

Так что вам необходимо либо @IdClass или @EmbeddedId. Все остальное не переносится и подвержено ошибкам. Я очень удивлен любым провайдером JPA, который не выбрасывает предупреждения для этого.

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