У меня есть класс сущностей, который просто 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
здесь (из-за каскадов). Что я могу сделать, чтобы он работал?
и ваш '@ IdClass'? –
Попробуйте определить 'foreignKey = @ForeignKey (name =" constraint ")' в '@ JoinColumn'. –
@BillyFrost У меня нет причины '@ IdClass', это кажется необязательным. Как я сказал, «упорство» отлично работает. – AjMeen