@idClass
使复合主键类成为非嵌入类,使用 @IdClass
批注为实体指定一个复合主键类(通常由两个或更多基元类型或 JDK 对象类型组成)。从原有数据库映射时(此时数据库键由多列组成),通常将出现复合主键。
复合主键类具有下列特征:
-
它是一个普通的旧式 Java 对象 (POJO) 类。
-
它必须为 public,并且必须有一个 public 无参数构造函数。
-
如果使用基于属性的访问,则主键类的属性必须为 public 或 protected。
-
它必须是可序列化的。
-
它必须定义
equals
和hashCode
方法。这些方法的值相等性的语义必须与键映射到的数据库类型的数据库相等性一致。
-
它的字段或属性的类型和名称必须与使用 @Id 进行批注的实体主键字段或属性的类型和名称相对应。
package com.model; import java.io.Serializable; public class SysUserRoleId implements Serializable{ /** * */ private static final long serialVersionUID = 2606793267849167078L; private Long userId; private Long roleId; @Override public int hashCode(){ int result = 1; result = userId.hashCode()+roleId.hashCode(); return result; } @Override public boolean equals(Object obj){ if(obj == null){ return false; } if(this == obj){ return true; } if(getClass() != obj.getClass()){ return false; } final SysUserRoleId other = (SysUserRoleId) obj; if(other.getUserId().equals(this.userId) && other.getRoleId().equals(this.roleId)){ return true; } return false; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } }
package com.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass; import javax.persistence.Table; @Entity @Table(name="SYS_USER_ROLE") @IdClass(SysUserRoleId.class) public class SysUserRole { private Long userId; private Long roleId; public SysUserRole(){ } public SysUserRole(Long userId,Long roleId){ this.userId = userId; this.roleId = roleId; } @Id @Column(name="user_id") public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } @Id @Column(name="role_id") public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } }
@EmbeddedId
使复合主键类成为由实体拥有的嵌入类
使用 @EmbeddedId
批注指定一个由实体拥有的可嵌入复合主键类(通常由两个或更多基元类型或 JDK 对象类型组成)。从原有数据库映射时(此时数据库键由多列组成),通常将出现复合主键。
复合主键类具有下列特征:
-
它是一个普通的旧式 Java 对象 (POJO) 类。
-
它必须为 public,并且必须有一个 public 无参数构造函数。
-
如果使用基于属性的访问,则主键类的属性必须为 public 或 protected。
-
它必须是可序列化的。
-
它必须定义
equals
和hashCode
方法。这些方法的值相等性的语义必须与键映射到的数据库类型的数据库相等性一致。
package com.model; import java.io.Serializable; import javax.persistence.Column; @SuppressWarnings("serial") public class SysOrganizationRolePKId implements Serializable{ private Long organizationId; private Long roleId; @Column(name="organization_id") public Long getOrganizationId() { return organizationId; } public void setOrganizationId(Long organizationId) { this.organizationId = organizationId; } @Column(name="role_id") public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } }
package com.model; import java.io.Serializable; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.Table; @Entity @SuppressWarnings("serial") @Table(name="SYS_ORGANIZATION_ROLE") public class SysOrganizationRole implements Serializable{ private SysOrganizationRolePKId sysOrganizationRolePKId; @EmbeddedId public SysOrganizationRolePKId getSysOrganizationRolePKId() { return sysOrganizationRolePKId; } public void setSysOrganizationRolePKId( SysOrganizationRolePKId sysOrganizationRolePKId) { this.sysOrganizationRolePKId = sysOrganizationRolePKId; } }