Столбец Hibernate, используемый как часть составного первичного ключа и части составного внешнего ключа одновременно

У меня есть эта структура таблицы, в которой нам не разрешено изменять, и у меня проблемы с поиском решения для сопоставления Hibernate.

Таблица А

a1 (pk)
a2

Таблица Б

b1 (pk, fk on 'A.a1')
b2 (pk)
b3

Таблица С

c1 (pk, fk on 'B.b1')
c2 (pk, fk on 'B.b2')
c3 (pk)
c4

Таблица D

d1 (pk)
d2 (pk, fk on 'A.a1')
d3 (fk on 'C.c2')
d4 (fk on 'C.c3')
d5

Теперь проблема, которую я получил, находится на уровне столбца d2 таблицы D, которая является частью составного ключа, а также частью внешнего ключа в таблице C.

В спящем режиме я сделал это

@Embeddable
public class TableDId {
    private Long d1;
    private TableA d2;

    @Column(name="d1")
    public Long getD1() {
        return this.d1;
    }

    @ManyToOne
    @JoinColumn(name="d2")
    public Long getD2() {
        return this.d2;
    }
    // Setters
}


@Entity
public class TableD {
    private TableDId id;
    private TableC tableC;

    @EmbeddedId @GeneratedValue(strategy = GenerationType.AUTO)    
    public TableDId getId() {
        return this.id;
    }

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="id.d2", referencedColumnName="c1"),
        @JoinColumn(name="d3", referencedColumnName="c2"),
        @JoinColumn(name="d4", referencedColumnName="c3")
    })
    public TableC getTableC() {
        return tableC;
    }

    // Setters
}

Как вы можете догадаться, это не работает, я получил ошибку Hibernate при сохранении нового TableD.

java.sql.BatchUpdateException: Unknown column 'id.d2' in 'field list'

Кто-нибудь может предложить рабочее решение?

Большое спасибо.


person BnW    schedule 27.07.2011    source источник


Ответы (2)


Вы должны опубликовать все аннотированные классы. Вы используете во всех классах @EmbeddedId или также используете IdClass? Вам следует ознакомиться со спецификацией JPA 2 в разделе «Отображение производных идентификаторов». Я считаю, что вам нужно использовать @MapsId в ассоциации. Или поместите аннотацию @Id в ассоциацию, но это будет зависеть от того, как именно вы сопоставили другие классы.

person Hardy    schedule 05.08.2011
comment
это вообще не решение - person Chan; 30.07.2012

@JoinColumn(name="id.d2", referencedColumnName="c1")

Попробуйте удалить id. из картографирования

@JoinColumn(name="d2", referencedColumnName="c1")

Пример http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html (раздел 2.2.6)

person Sergey Galchenko    schedule 01.08.2011
comment
Это тоже не работает; Repeated column in mapping for entity: TableD column: d2 (should be mapped with insert="false" update="false") и добавление insert="false" update="false" тоже не работает - person BnW; 02.08.2011