我是Hibernate的新手,必须支持使用Hibernate的现有应用程序。这是一个纯报表应用程序-无需插入/更新/删除-仅选择
我可以看到在同一类的多个字段中使用了@Id注释的现有POJO对象
我的理解是,对于复合主键-您需要使用@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批注
我很困惑为什么它可以编译和工作?谢谢akila
根据Hibernate文档,Hibernate似乎允许这样做,但是它不符合JPA。
5.1.2.1.2。没有标识符类型的多个id属性 另一种可能更自然的方法是将@Id放在实体的多个属性上。Hibernate仅支持此方法(不符合JPA),而不需要额外的可嵌入组件。
5.1.2.1.2。没有标识符类型的多个id属性
另一种可能更自然的方法是将@Id放在实体的多个属性上。Hibernate仅支持此方法(不符合JPA),而不需要额外的可嵌入组件。
http://docs.jboss.org/hibernate/core/3.6/reference/zh- CN/html_single/#d0e4819
对于符合JPA的解决方案,您必须为此设置指定其他@IDClass(或使用EmbeddedId):
http://www.objectdb.com/java/jpa/entity/id