Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA annotations: связывание композитными ключами / 22 сообщений из 22, страница 1 из 1
22.10.2012, 15:34:17
    #38008311
wg
wg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Приветствую!

Пытаюсь натянуть hibernate на существующую структуры бд. Primary key там суррогатных нету, делаем составные.

Получается, что PrimaryKey состоит из 5ти колонок: year, type, area_id, short_code, long_code . В то же время, эти колонки выступают в качестве составных внешних ключей на другие таблицы: year, type, area_id на одну и year, short_code, long_code на другую. Year используется в обоих внешних ключах.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
    @Entity
    @Table(name = "equipment")
    @IdClass(value = EquipmentId.class)
    public class Equipment {

        private Model model;

        private EquipmentPackage eqPackage;

        @Id
        public Model getModel() {
            return model;
        }

        @Id
        public EquipmentPackage getEqPackage() {
            return eqPackage;
        }

       // all other stuff: fields, getters and setters
    }

    public class EquipmentId {

        private Model model;

        private EquipmentPackage eqPackage;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({ @JoinColumn(name = "year", referencedColumnName = "year", insertable = false),
                @JoinColumn(name = "type", referencedColumnName = "type", insertable = false),
                @JoinColumn(name = "area_id", referencedColumnName = "area_id", insertable = false) })
        public Model getModel() {
            return model;
        }

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({ @JoinColumn(name = "year", referencedColumnName = "year", insertable = false),
                @JoinColumn(name = "short_code", referencedColumnName = "short_code", insertable = false),
                @JoinColumn(name = "long_code", referencedColumnName = "long_code", insertable = false) })
        public EquipmentPackage getEqPackage() {
            return eqPackage;
        }

    }



Теперь, я пытаюсь использовать указанный выше объект в другом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
    @Entity
    @Table(name = "description")
    @IdClass(value = DescriptionId.class)
    class Description {

        private Equipment equipment;

        private String langCode;

        @Id
        public Equipment getEquipment() {
            return equipment;
        }

        @Id
        public String getLangCode() {
            return langCode;
        }

       // all other stuff: fields, getters and setters
    }

    public class DescriptionId {

        private Equipment equipment;

        private String langCode;

        @ManyToOne
        @JoinColumns({
            @JoinColumn(name = "year", referencedColumnName = "year"),
            @JoinColumn(name = "type", referencedColumnName = "type"),
            @JoinColumn(name = "area_id", referencedColumnName = "area_id"),
            @JoinColumn(name = "short_code", referencedColumnName = "short_code"),
            @JoinColumn(name = "long_code", referencedColumnName = "long_code")
        })
        public Equipment getEquipment() {
            return equipment;
        }

        @Column(name = "lang")
        public String getLangCode() {
            return langCode;
        }
    }



Получается, что Description имеет PrimaryKey: year, type, area_id, short_code, long_code, lang и связан с Equipment внешним ключом year, type, area_id, short_code, long_code

Запускаю - получаю
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Caused by: org.hibernate.MappingException: property mapping has wrong number of columns: database.entity.equipment.Description._identifierMapper type: component[equipment,langCode]
	at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:459)
	at org.hibernate.mapping.RootClass.validate(RootClass.java:215)
	at org.hibernate.cfg.Configuration.validate(Configuration.java:1149)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1334)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860)
	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779)
	at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
	... 38 more



Подскажите, плиз, в чём может быть проблема. У кого какие идеи?
...
Рейтинг: 0 / 0
22.10.2012, 15:41:20
    #38008324
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Не обнаружил в коде аннотаций @EmbeddedId и @Embeddable. Вроде на них делаются композитные ключи.
...
Рейтинг: 0 / 0
22.10.2012, 17:10:21
    #38008523
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
wg,
Вставить 1 поле счетчик FK
...
Рейтинг: 0 / 0
22.10.2012, 17:10:46
    #38008525
wg
wg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Blazkowicz,

можно через IdClass: Difference using @Id and @EmbeddedId for a compound key
...
Рейтинг: 0 / 0
22.10.2012, 17:21:02
    #38008552
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
wgможно через IdClass
ОК. Тогда вопрос закрыт?
wg Difference using @Id and @EmbeddedId for a compound key
Это вообще какая-то неотносящаяся к вашей проблеме тема.

У меня вот так работает
Код: java
1.
2.
3.
4.
5.
@Embeddable
public class ParticipationId implements Serializable{
    @ManyToOne(optional = false)
    @JoinColumn(name = "fk_user")
    private User user;
...
Рейтинг: 0 / 0
22.10.2012, 17:23:54
    #38008559
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Аффтар. Вообще, странно. Как эта бд вообще работает.
Приведите структуру.
...
Рейтинг: 0 / 0
22.10.2012, 17:24:51
    #38008562
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
а то что там где ни попадя @ID, никого не смущает?
...
Рейтинг: 0 / 0
22.10.2012, 17:30:25
    #38008567
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Лагмана то что там где ни попадя @ID, никого не смущает?
http://docs.oracle.com/javaee/5/api/javax/persistence/IdClass.html
...
Рейтинг: 0 / 0
22.10.2012, 17:33:20
    #38008569
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Blazkowicz,

а.. извините
...
Рейтинг: 0 / 0
22.10.2012, 17:36:07
    #38008578
wg
wg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Petro123wg,
Вставить 1 поле счетчик FK

немного подробнее, плиз. куда вставить, как пометить? Мож ссылку на доки или пример?
...
Рейтинг: 0 / 0
22.10.2012, 17:37:27
    #38008581
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Blazkowicz,

Проблема в связях с другими таблицами. Ждём базу
...
Рейтинг: 0 / 0
22.10.2012, 17:39:46
    #38008586
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Petro123Проблема в связях с другими таблицами. Ждём базу
База понятна. Есть куча натуральных ключей составленых в разных комбинациях из этих полей.
year, type, area_id, short_code, long_code, lang
Стоило бы под эти комбинации завести примитивные ключи и через них делать ассоциации.
Автор же решил хитрее замапить, чтобы ещё сильнее запустать потенциального читателя.
...
Рейтинг: 0 / 0
22.10.2012, 17:41:11
    #38008588
wg
wg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Petro123Blazkowicz,

Проблема в связях с другими таблицами. Ждём базу

думаете косяк в другом?.. ok, скоро выложу
...
Рейтинг: 0 / 0
22.10.2012, 17:43:20
    #38008594
wg
wg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
BlazkowiczPetro123Проблема в связях с другими таблицами. Ждём базу
База понятна. Есть куча натуральных ключей составленых в разных комбинациях из этих полей.
year, type, area_id, short_code, long_code, lang
Стоило бы под эти комбинации завести примитивные ключи и через них делать ассоциации.
Автор же решил хитрее замапить, чтобы ещё сильнее запустать потенциального читателя.

эу! писал же, что натягиваю на готовую базу 10ти-летней давности) Я же просто мазохизмом страдаю) Не могу лезть в бд и менять ничего
...
Рейтинг: 0 / 0
22.10.2012, 17:44:14
    #38008598
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Blazkowicz,
Год внешним ключиком?
Не знаю... пишу имхо...но мне интерсен пример базы)
...
Рейтинг: 0 / 0
22.10.2012, 17:44:39
    #38008599
wg
wg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
wgэу! писал же, что натягиваю на готовую базу 10ти-летней давности) Я же просто мазохизмом страдаю) Не могу лезть в бд и менять ничего

я же НЕ просто мазохизмом страдаю. очепятка
...
Рейтинг: 0 / 0
22.10.2012, 17:46:40
    #38008604
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
wgэу! писал же, что натягиваю на готовую базу 10ти-летней давности) Я же просто мазохизмом страдаю) Не могу лезть в бд и менять ничего
Я не имел ввиду менять базу. Переделайте так чтобы убрать ManyToOne из Id. Это реально?
...
Рейтинг: 0 / 0
22.10.2012, 17:47:20
    #38008606
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Petro123Blazkowicz,
Год внешним ключиком?
Не знаю... пишу имхо...но мне интерсен пример базы)
мля, ну композитный же ключ, включает в себя и год тоже. Что не понятно?
...
Рейтинг: 0 / 0
22.10.2012, 18:03:27
    #38008637
wg
wg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Blazkowiczwgэу! писал же, что натягиваю на готовую базу 10ти-летней давности) Я же просто мазохизмом страдаю) Не могу лезть в бд и менять ничего
Я не имел ввиду менять базу. Переделайте так чтобы убрать ManyToOne из Id. Это реально?

не знаю. я сделал так по своему разумению, т.к. в БД действительно такие составные Id и внешние ключи используют поля этих id'шников. наверное, по-другому это не свяжешь
...
Рейтинг: 0 / 0
22.10.2012, 18:19:21
    #38008661
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Blazkowicz,
ну прав ты прав. Пусть не даёт БД. OK?
...
Рейтинг: 0 / 0
23.10.2012, 10:19:41
    #38009310
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
wgне знаю. я сделал так по своему разумению, т.к. в БД действительно такие составные Id и внешние ключи используют поля этих id'шников. наверное, по-другому это не свяжешь
1) Попробуйте Embedded
2) Подебажте хибернейт в том месте где он выкидывает исключение, чтобы разобраться.
3) Попробуйте убрать ассоциации из ключей, если получится.
...
Рейтинг: 0 / 0
26.10.2012, 09:43:34
    #38014076
wg
wg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA annotations: связывание композитными ключами
Кажется я сделал так, как мне советовали, убрал ассоциации с ключей.
Мне пришлось добавить некоторое дублирование в entity: я добавил поля для всех колонок БД, которые участвуют в маппинге и переместил Id аннотации на эти поля(см. код).
@Entity
@Table(name = "equipment")
@IdClass(value = EquipmentId.class)
public class Equipment {

private Model model;

private Integer year;

private String type;

private Integer areaId;

private String shortCode;

private String longCode;

@Id
public Integer getYear() {
//...
}

// и для всех новый полей так же


private EquipmentPackage eqPackage;

@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "year", referencedColumnName = "year", insertable = false),
@JoinColumn(name = "type", referencedColumnName = "type", insertable = false),
@JoinColumn(name = "area_id", referencedColumnName = "area_id", insertable = false) })

public Model getModel() {
return model;
}

@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name = "year", referencedColumnName = "year"),
@JoinColumn(name = "type", referencedColumnName = "type"),
@JoinColumn(name = "area_id", referencedColumnName = "area_id"),
@JoinColumn(name = "short_code", referencedColumnName = "short_code"),
@JoinColumn(name = "long_code", referencedColumnName = "long_code")
})

public EquipmentPackage getEqPackage() {
return eqPackage;
}

// all other stuff: fields, getters and setters
}

public class EquipmentId {

private Model model;

private EquipmentPackage eqPackage;


private Integer year;

private String type;

private Integer areaId;

private String shortCode;

private String longCode;

@Column(name = "year")
public Integer getYear() {
// ...
}

// и для всех остальных новых полей так же


@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "year", referencedColumnName = "year", insertable = false),
@JoinColumn(name = "type", referencedColumnName = "type", insertable = false),
@JoinColumn(name = "area_id", referencedColumnName = "area_id", insertable = false) })
public Model getModel() {
return model;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "year", referencedColumnName = "year", insertable = false),
@JoinColumn(name = "short_code", referencedColumnName = "short_code", insertable = false),
@JoinColumn(name = "long_code", referencedColumnName = "long_code", insertable = false) })
public EquipmentPackage getEqPackage() {
return eqPackage;
}

}



Благодарю за помощь!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA annotations: связывание композитными ключами / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]