0

Например, у меня есть класс А с каскаде 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, что делает поставщик сохранения игнорировать запись этого поля в базе данных.