【问题标题】:How to access fields of @EmbeddedId?如何访问@EmbeddedId 的字段?
【发布时间】:2018-01-03 10:44:54
【问题描述】:

我有一个具有复合主键的@Entity。因此,我创建了一个 @EmbeddedId 来保存 PK 字段。

问题:直接通过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()

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

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

【问题讨论】:

  • 这可能是一个偏好问题,但我想说不要在父类中提供 getter 和 setter。如果嵌入类中的字段发生变化怎么办?有些可能会导致编译错误,但是如果您向其中添加一个字段并忘记将 getter/setter 包装在父类中怎么办?我个人在嵌入式类上使用 getter 和 setter,person.getId().getFirstName() 也是如此
  • 我想知道JPA规范中是否也有任何关于它的内容?download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/…我自己什么都看不到

标签: java hibernate


【解决方案1】:

您不必创建属性

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    
}

并且仅使用 PersonId 来加载 MyPerson 实体:

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

【讨论】:

  • 但这意味着我会复制包括 getter+setter 在内的字段?在MyPersonPersonId 中,对吗?如果是这样 - 真的可取吗?想象一下每个属性都有额外的配置,比如@NotNull @Length(min=10, max=20) @Column(nullable=false, length=20) private String firstname。然后我必须在双方都保持这种配置?
  • 此配置只能在实体端。键类可以不加任何注解。
猜你喜欢
  • 2018-10-12
  • 1970-01-01
  • 2021-02-23
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多