Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JPA annotations: связывание композитными ключами


Автор: Stifler 22.10.2012, 14:36
Приветствую!

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

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

Код

    @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;
        }

    }


Теперь, я пытаюсь использовать указанный выше объект в другом:
Код

    @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

Запускаю - получаю 
Код

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


Подскажите, плиз, в чём может быть проблема. У кого какие идеи?

Автор: Stifler 26.10.2012, 08:46
Нашёл http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=977995&msg=13378404

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)