EmbeddedId и session.load - PullRequest
       3

EmbeddedId и session.load

0 голосов
/ 14 февраля 2011

У меня есть 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. (Я знаю, что это не тривиально, но идентификатор пользователя уникален, а имя и фамилия также являются первичными ключами, поскольку не может быть более одного пользователя с одинаковыми именем пользователя и паролем).

Как я могу сделать это, не настраивая для каждого класса SQL-запрос?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

Вы не должны вставлять 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 голос
/ 14 февраля 2011

Если вам на самом деле не нужен составной ключ, возможно, будет лучше использовать @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; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...