2014-11-06 6 views
2

мне нужна помощь, чтобы создать правильный Pojo от этой базы данных ...Композитные ключи с Hibernate

https://www.dropbox.com/s/j2lfu44zpqfcxb4/dbr.PNG

Я попытался создать эти классы ...

@Entity 
    @Table(name="Municipio", catalog="elecciones2014", schema="") 
    public class Municipio implements Serializable{ 

    @EmbeddedId 
    private MunicipioPk idMunicipio; 

    @Basic(optional=false) 
    @Column(name="nomb_municipio") 
    private String nomb_municipio; 
}  

С помощью этого встроенного класса

@Embeddable 
    class MunicipioPk implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Column(name="id_depto") 
    String departamento; 

    @Column(name="id_municipio") 
    String idMunicipio; 

} 

Проблема в том, когда я хочу ссылаться на «Мун icipio 'из' JRV 'y не знаю, как получить доступ к полю' id_municipio '. У меня был этот код, но он не работает

@Entity 
@Table(name = "JRV", catalog = "elecciones2014", schema = "") 
public class Jrv { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "id_jrv")  
private int id; 


@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="id_municipio",referencedColumnName="idMunicipio") 
private Municipio municipio; 

@ManyToOne 
@JoinColumn(name="DUI",referencedColumnName="dui") 
private PadronElectoral dui; 
}  

Может кто-нибудь мне помочь? как я должен это делать? Спасибо, совет!

ответ

1

Здесь вы определяете один столбец объединения, но PK Municipio entity имеет две колонки. Также referencedColumnName должно быть именем столбца, а не его собственностью.

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="id_municipio",referencedColumnName="idMunicipio") 
private Municipio municipio; 

Так что вы могли бы сделать что-то вроде этого:

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumns({ 
    @JoinColumn(name="id_municipio", referencedColumnName="id_municipio"), 
    @JoinColumn(name="id_depto", referencedColumnName="id_depto") 
}) 
private Municipio municipio; 

Который переводит к этому SQL (я получил это путем создания SQL-схемы из ваших сущностей после модификации упомянутых выше):

create table elecciones2014.JRV (
    id_jrv serial not null, 
    id_depto varchar(255), 
    id_municipio varchar(255), 
    primary key (id_jrv) 
); 

alter table elecciones2014.JRV 
    add constraint FK_7scd8alu3nf4tsyh3hq2ryrja 
    foreign key (id_depto, id_municipio) 
    references elecciones2014.Municipio; 
+0

Спасибо за вашу помощь, но теперь я получаю это исключение org.hibernate.MappingException: Не удалось найти столбец с логическим именем: id_municipio в org.hibernate.mapping. Таблица (elecciones2014.Municipio) и связанные с ней суперадвативы и вторичные таблицы –

+0

Странно ... это сработало для меня, когда я попробовал это на сущности в вашем вопросе. Являются ли ваши объекты одинаковыми в вашем проекте, как в вашем вопросе, или вы каким-то образом изменили их? В частности, проверьте, действительно ли ваш муниципальный ключ в вашем встроенном идентификаторе id_municipio. В противном случае я не вижу причины, почему это не сработает. –

+0

Вы были правы, это сработало отлично. У меня была ошибка в коде моего проекта, но после ее решения ваш ответ сработал. Большое спасибо!! –

Смежные вопросы