Первичный ключ Hibernate Composite содержит внешний ключ, который является подмножеством первичного ключа других таблиц, как сопоставить?

Сценарий следующий

В таблице А есть составной ПК.

Table A 
--------
a1 (pk)
a2 (pk)
a3 (pk)
foo
bar
LastUpdateDate
LastUpdateUser ========

Таблица B также имеет составной ПК, который на самом деле является подмножеством ПК А, здесь также работает как FK. Нет принудительного ограничения FK.

Table B 
-------- a1 (fk,pk) a2 (fk,pk) foo bar LastUpdateDate LastUpdateUser ========

Я пробовал несколько способов, и ни один из них не работает. Может ли кто-нибудь сказать рабочее решение для сопоставления Hibernate? лучше в стиле аннотации.

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

Вив


person Viv    schedule 02.06.2011    source источник
comment
Вы заинтересованы в использовании ассоциаций в качестве PK для B? По сути, как вы хотите связать А и Б? Какие типы для a1,a2,a3?   -  person Alex Gitelman    schedule 02.06.2011
comment
Я хочу получить запись таблицы B для таблицы A, в основном сопоставление ManyToOne в объекте таблицы A. Является ли это возможным? - Вив   -  person Viv    schedule 02.06.2011


Ответы (1)


Я вижу следующую настройку. Хотя может быть сложно приступить к работе и, исходя из моего опыта, это ненужная сложность.

class A implements Serializable {
   @Id
   private PK id = new PK();
   @Embeddable      
    public static final class PK implements Serializable {
        @ManyToOne 
        @JoinColumns ({
        @JoinColumn(name="A1_COL", referencedColumnName = "id.a1"),
        @JoinColumn(name="A2_COL", referencedColumnName = "id.a2"),

        })
         B b;            
        @Basic String a3;
    }    
 }


class B implements Serializable {
   @Id
   private PK id = new PK();
   @Embeddable      
    public static final class PK implements Serializable {                    
        @Basic String a1;
        @Basic String a2;
        @Basic String a3;
    }    
 }

Вы должны иметь доступ через

a.getId().getB()

При необходимости добавьте сеттеры/геттеры.

Обычно этот тип проблем требует большого количества проб и ошибок, поэтому не ожидайте, что это сработает сразу. Но это должно дать вам направление для копания. Как только вы определите окончательную конфигурацию, добавьте ее в свой вопрос, чтобы кто-то мог извлечь из нее пользу в будущем.

person Alex Gitelman    schedule 02.06.2011