将@Id用于同一个类中的多个字段

时间:2013-11-06 13:28:30

标签: hibernate

我是Hibernate的新手,必须支持使用Hibernate的现有应用程序     它是一个纯粹的报告应用程序 - 没有插入/更新/删除 - 只选择

我可以看到现有的POJO对象在同一个类中的多个字段中使用了@Id注释

我的理解是,对于复合主键 - 您需要使用@Embeddable和@EmbeddedId

然而,这在我的课程中没有定义,奇怪的是代码编译并运行得很好

以下是我的代码示例:

package com.xyz.vo;

import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;

@Entity(name="com.xyz.vo.Emp")
@Table(name = "TEmployee")
public class Emp implements Serializable    {
private java.lang.Integer  empId;
@Id 
@Column(name = "EMP_ID")   
public java.lang.Integer  getEmpId(){   
    return this.empId;
}

public  void  setEmpId(java.lang.Integer empId){    
    this.empId=empId;
}

private java.lang.Integer  empAge;
@Id 
@Column(name = "EMP_AGE")   
public java.lang.Integer  getEmpAge(){  
    return this.empAge;
}

    public  void  setEmpAge(java.lang.Integer empAge){  
    this.empAge=empAge;
}

    private String empName;
    @Column(name = "EMP_NAME")   
public String  getEmpName(){    
    return this.empName;
}

    public  void  setEmpName(String empName){   
    this.empName=empName;
}

和pojo中的更多字段 - 没有@Id定义

注意 - 这里有两个字段有@Id注释

我很困惑,为什么这个编译和工作? 谢谢 阿基拉

1 个答案:

答案 0 :(得分:9)

根据Hibernate文档,Hibernate似乎允许这样做,但它不符合JPA。

  

5.1.2.1.2。没有标识符类型的多个id属性

     

另一种可以说更自然的方法是将@Id放在多个上   您实体的属性。这种方法只有   Hibernate(不符合JPA)但不需要额外的嵌入   成分

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e4819

对于符合JPA的解决方案,您必须为此设置指定一个额外的@IDClass(或使用EmbeddedId):

http://www.objectdb.com/java/jpa/entity/id