(я новичок в JPA)
У меня есть 3 объекта JPA: пользователь, настройка и настройка пользователя.
Отношения:
ManyToOne между UserSetting, User;
ManyToOne между UserSetting, Setting.
Цель:
при добавлении записи в UserSetting, запись в настройке должна быть добавлена, только если она не существует.
Вопрос:
Я попробовал cascade = All в UserSetting on Setting, но это не удалось, если настройка уже существует.
Я могу написать несколько запросов, которые добавляют параметр, если он не существует, а затем добавить набор параметров пользователя без каскадирования в таблицу параметров. Но это не звучит разумно.
Каков приемлемый способ сделать это в JPA?
Вот код сущности:
@Entity
@Table(name = "USERS", uniqueConstraints = @UniqueConstraint(columnNames = "USER_ID"))
@SequenceGenerator(name = "UserSeq", sequenceName = "USER_SEQ")
public class UserEntity {
private long id;
private Set<UserSettingEntity> settings;
public UserEntity() {
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "UserSeq")
@Column(name = "ID")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name = "SETTING")
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
public Set<UserSettingEntity> getSettings() {
if (settings == null) {
settings = new HashSet<UserSettingEntity>();
}
return settings;
}
}
@Entity
@Table(name = "USER_SETTINGS", uniqueConstraints = @UniqueConstraint(columnNames = {"USER_ID", "SETTING_ID"}))
@SequenceGenerator(name = "UserSettingSeq", sequenceName = "USER_SETTING_SEQ")
public class UserSettingEntity {
private Long id;
private UserEntity user;
private SettingEntity setting;
private String value;
public UserSettingEntity() {
}
public UserSettingEntity(UserEntity user, SettingEntity setting, String value) {
this.user = user;
this.setting = setting;
this.value = value;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "UserSettingSeq")
@Column(name = "ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "USER_ID", nullable = false)
public UserConfigEntity getUser() {
return user;
}
public void setUser(UserConfigEntity user) {
this.user = user;
}
//if setting exists in database, dont try to add it again
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "SETTING_ID", nullable = false)
public SettingEntity getSetting() {
return setting;
}
public void setSetting(SettingEntity setting) {
this.setting = setting;
}
@Column(name = "VALUE")
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@Entity
@Table(name = "SETTING", uniqueConstraints = @UniqueConstraint(columnNames = {"CATEGORY", "CONTEXT", "NAME"}))
@SequenceGenerator(name = "SettingEntitySeq", sequenceName = "SETTING_SEQ")
public class SettingEntity {
private Long id;
private String name;
...
public SettingEntity(String category, String name) {
this.name = name;
}
public SettingEntity() {
}
@Id
@Column(name = "SETTING_ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SettingEntitySeq")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}