embeddedId和session.load

时间:2011-02-14 14:26:14

标签: java hibernate

我有3个主键,如下例所示:

@Entity
class User {
  @EmbeddedId
  @AttributeOverride(name="firstName", column=@Column(name="fld_firstname")
  UserId id;

  Integer age;
}

@Embeddable
class UserId implements Serializable {
  String firstName;
  String lastName;
  String idUser;
}

在我的应用程序中,当我运行session.load(persistenceClass,idClass)时,它应该返回其idUser为idClass的用户。 (我知道这不是微不足道的,但是用户的ID是唯一的,并且名字和姓氏也是主键,因为不能有多个用户使用相同的用户名和密码)。

如果不为每个类自定义SQL查询,我该怎么办?

2 个答案:

答案 0 :(得分:2)

您不应在主键中嵌入firstName和lastName。 userId应该是您的主键,您应该在[firstName,lastName]上添加唯一约束。顺便说一句,将这些附加字段放在主键中仅保证[idUser,firstName,lastName]是唯一的,但是您可能仍然有两个用户具有不同的idUsers,但具有相同的[firstName,lastName]。

现在回答原来的问题,我不知道问题出在哪里:

UserId userId = new UserId("theId", "theFirstName", "theLastName");
User user = (User) session.load(User.class, userId);

答案 1 :(得分:1)

如果您实际上不需要复合键,或许最好使用@UniqueContraint来确保唯一性:

@Entity
@Table(uniqueConstraints = 
    @UniqueConstraint(columnNames = {"idUser", "fld_firstName", "lastName"}))
class User {   
    @Id
    String idUser;

    @Column(name="fld_firstname")
    String firstName;       
    String lastName;       
    Integer age; 
}