Hibernate Каскад другой идентификатор из другой базы данных
Например, у меня есть класс A с каскадом B:
public class A{
private String id;
private Set<B> bs = new HashSet<B>(0);
@Id
@GenericGenerator(name = "seq_id", strategy = generators.SequenceIdGenerator")
@GeneratedValue(generator = "seq_id")
@COLUMN(name="id" unique = true, nullable = false, length = 28)
public void getId(){
return this.id;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "A")
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE, CascadeType.PERSIST})
public void getBs(){
return bs;
}
}
и у меня есть B, который имеет свой собственный идентификатор и столбец, содержащий идентификатор из A
public class B
String id;
String aId;
A a;
@Id
@GenericGenerator(name = "seq_id", strategy = "generators.SequenceIdGenerator")
@GeneratedValue(generator = "seq_id")
@Column(name = "ID", unique = true, nullable = false, length = 28)
public String getId() {
return this.id;
}
@Column(name = "A_ID", nullable = false, length = 28)
public String getAId() {
return aId;
}
public void setAId(String aId) {
this.aId = aId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "A_ID", nullable = false, insertable = false, updatable = false)
@MapsId("aId")
public Admission getAdmission() {
return this.admission;
}
public void setAdmission(Admission admission) {
this.admission = admission;
}
как мне автоматически назначить aId после сохранения A? Я хочу установить aId, но всегда получаю сообщение об ошибке, в котором говорится, что для A_ID нельзя установить значение null.
Спасибо!
1 ответ
При использовании производного идентификатора с общими сопоставлениями вам нужно не только поставить @MapsId
анотация в отношениях, но аннотировать поле, ссылающееся на идентификатор отношения с @Id
аннотаций.
Посмотрите, как это сделать (сеттеры опущены):
public class B {
String id;
String aId;
A a;
@Id
@GenericGenerator(name = "seq_id", strategy = "generators.SequenceIdGenerator")
@GeneratedValue(generator = "seq_id")
@Column(name = "ID", unique = true, nullable = false, length = 28)
public String getId() {
return this.id;
}
@Id
public String getAId() {
return aId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "A_ID", nullable = false)
@MapsId("aId")
public A getA() {
return this.a;
}
}
Другая ошибка в том, что вы аннотировали ваши отношения, чтобы быть updatable = false
а также insertable = false
, заставляя поставщика постоянства игнорировать запись этого поля в базу данных.