2014-11-06 58 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; 

} 

问题是当我想参考'门来自'JRV'的icipio'不知道如何访问'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

这里您定义了单个连接列,但Municipio实体的PK有两列。另外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:无法在org.hibernate.mapping中查找具有逻辑名称的列id_municipio。表(elecciones2014.Municipio)及其相关的超类和副表 – 2014-11-06 20:38:54

+0

奇怪......当我在你的问题的实体上尝试它时,它对我有效。您的项目中的实体与您的问题中的项目是否相同,或者您在此期间以某种方式修改了它们?具体检查一下你的嵌入式ID中的municipio密钥是否真的是id_municipio。否则,我不认为这是行不通的原因。 – 2014-11-06 21:01:04

+0

你是对的,它的工作很完美。我的项目代码中有一个错误,但在解决问题后,您的答案奏效了。非常感谢!! – 2014-11-08 17:51:55