powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA annotations: связывание композитными ключами
22 сообщений из 22, страница 1 из 1
JPA annotations: связывание композитными ключами
    #38008311
wg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wg
Гость
Приветствую!

Пытаюсь натянуть 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
JPA annotations: связывание композитными ключами
    #38008324
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не обнаружил в коде аннотаций @EmbeddedId и @Embeddable. Вроде на них делаются композитные ключи.
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38008523
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wg,
Вставить 1 поле счетчик FK
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38008525
wg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wg
Гость
Blazkowicz,

можно через IdClass: Difference using @Id and @EmbeddedId for a compound key
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38008552
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JPA annotations: связывание композитными ключами
    #38008559
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аффтар. Вообще, странно. Как эта бд вообще работает.
Приведите структуру.
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38008562
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а то что там где ни попадя @ID, никого не смущает?
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38008567
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лагмана то что там где ни попадя @ID, никого не смущает?
http://docs.oracle.com/javaee/5/api/javax/persistence/IdClass.html
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38008569
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

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

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

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

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

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

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

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

не знаю. я сделал так по своему разумению, т.к. в БД действительно такие составные Id и внешние ключи используют поля этих id'шников. наверное, по-другому это не свяжешь
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38008661
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
ну прав ты прав. Пусть не даёт БД. OK?
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38009310
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wgне знаю. я сделал так по своему разумению, т.к. в БД действительно такие составные Id и внешние ключи используют поля этих id'шников. наверное, по-другому это не свяжешь
1) Попробуйте Embedded
2) Подебажте хибернейт в том месте где он выкидывает исключение, чтобы разобраться.
3) Попробуйте убрать ассоциации из ключей, если получится.
...
Рейтинг: 0 / 0
JPA annotations: связывание композитными ключами
    #38014076
wg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wg
Гость
Кажется я сделал так, как мне советовали, убрал ассоциации с ключей.
Мне пришлось добавить некоторое дублирование в 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
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA annotations: связывание композитными ключами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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