Столбец гибернации, используемый как часть составного первичного ключа и составного внешнего ключа одновременно - PullRequest
1 голос
/ 27 июля 2011

Я получил эту структуру таблицы, где нам не разрешено изменять, и у меня возникают проблемы с поиском решения для отображения Hibernate.

Таблица A

a1 (pk)
a2

Таблица B

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

Таблица C

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

В Hibernate я сделал это

@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'

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

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

Ответы [ 2 ]

1 голос
/ 01 августа 2011
@JoinColumn(name="id.d2", referencedColumnName="c1")

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

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

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

0 голосов
/ 05 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...