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

Другие вопросы по тегам