JPA 2.0冗余@Id字段映射的嵌套ID类命名规则问询
Great question—let's break this down strictly according to the JPA 2.0 (JSR-317) specification, so we're relying on standard behavior rather than any specific implementation.
First, let's clarify the core distinction between the two scenarios you mentioned:
1. Derived Identifier Scenario (Your Original Example)
In this case, the entity's primary key is directly composed of an associated entity's primary key. For your Project entity, the dept field is annotated with both @Id and @ManyToOne, meaning it's part of the composite primary key and derives its value from the associated Department entity.
Per the JPA spec, the @IdClass (here, ProjectId) must have a field with the exact same name as the @Id-marked association property (dept). This is because the association property itself is a component of the primary key.
2. Non-Derived Identifier (Redundant @Id Field) Scenario (JPA 1.0 Style)
This is the scenario you're asking about: the entity has separate, redundant @Id fields (e.g., deptId) that mirror the associated entity's primary key, plus a standalone association property (e.g., dept) that isn't marked with @Id.
The critical rule here comes directly from JPA 2.0 Specification Section 2.4.1:
The names of the fields or properties in the primary key class must correspond to the names of the fields or properties in the entity class that are annotated with @Id or marked as id in the XML mapping.
Key Takeaway
For this non-derived scenario, the @IdClass fields only need to match the names of the @Id-annotated fields/properties in the entity—they do NOT need to match the name of the association property.
Example Code
To make this concrete:
Entity Class (Non-Derived, Redundant Mapping)
@Entity @IdClass(ProjectId.class) public class Project { @Id private Integer deptId; // Redundant @Id field, part of composite PK @Id private String projectName; @ManyToOne private Department dept; // Association property, NOT marked @Id // Getters, setters, equals/hashCode }
Valid @IdClass (Custom Field Name)
public class ProjectId implements Serializable { private Integer deptId; // Matches the @Id field in Project, NOT the association property name private String projectName; // equals/hashCode implementation }
You could even name the ProjectId field something like departmentId—as long as you update the Project entity's @Id field to match that name (e.g., @Id private Integer departmentId;), it will comply with the JPA spec.
内容的提问来源于stack exchange,提问作者Kawu

