Java 如何访问@EmbeddedId的字段?

Java 如何访问@EmbeddedId的字段?,java,hibernate,Java,Hibernate,我有一个具有复合主键的@实体。因此,我创建了一个包含PK字段的@EmbeddedId 问题:通过id.*直接访问这些字段更好,还是应该在父类中创建getter/setter 例如: @Entity public class MyPerson { @EmbeddedId private PersonId id; public String getFirstname() { return id.getFirstname(); } pu

我有一个具有复合主键的
@实体
。因此,我创建了一个包含PK字段的
@EmbeddedId

问题:通过
id.*
直接访问这些字段更好,还是应该在父类中创建getter/setter

例如:

@Entity
public class MyPerson {
    @EmbeddedId
    private PersonId id;

    public String getFirstname() {
        return id.getFirstname();   
    }

    public String getLastname() {
        return id.getLastname();
    }

    public LocalDate getDob() {
        return id.getDob();
    }   
}

@Embeddable
public class PersonId implements Serializable {
    private String firstname;
    private String lastname;
    private LocalDate dob;

    //getter+setter as well
}
我最好使用
person.getFistname()
还是
person.getId().getFirstname()

前者更清楚,但缺点是我必须在
MyPerson
PersonId
中创建getter


首选的访问方式是什么?为什么?

您不必创建属性

private PersonId id
替代方案是

@Entity  @IdClass(PersonId.class)
public class MyPerson {
    @Id private String firstname;
    @Id private String lastname;
    @Id private LocalDate dob;

    // Getters and setters here    
}
并且仅在加载MyPerson实体时使用PersonId:

PersonId peronId = new PersonId(firstname, lastname, dob);
MyPerson person = session.get(MyPerson.class, personId);

这可能是一个偏好问题,但我要说的是不要在父类中提供getter和setter。如果嵌入类中的字段发生更改怎么办?有些可能会导致编译错误,但如果您向其中添加了一个字段,而忘记在父类中包装getter/setter,该怎么办?就我个人而言,我在嵌入式类上使用getter和setter,person.getId().getFirstName()我想知道JPA规范中是否也有关于它的内容?我自己看不到任何内容,但这意味着我将复制包括getter+setter在内的字段?在
MyPerson
PersonId
中,对吗?如果是的话,这真的是明智的吗?假设每个属性都有额外的配置,如
@NotNull@Length(min=10,max=20)@Column(nullable=false,Length=20)private String firstname
。然后,我必须在两个方面都维护配置?此配置必须仅在实体方面。键类可以不带任何注释。