JPA: Как объект @Embeddable может получить ссылку на своего владельца? - PullRequest
10 голосов
/ 21 февраля 2011

У меня есть класс User, в который встроен класс Profile.Как я могу дать экземплярам профиля ссылку на их владельца класса пользователя?

@Entity
class User implements Serializable  {
   @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;

   @Embedded Profile profile;

   // .. other properties ..
}

@Embeddable
class Profile implements Serializable {

   User user; // how to make this work?

   setURL(String url) {
      if (user.active() ) { // for this kind of usage
         // do something
      }
   }

   // .. other properties ..
}

Ответы [ 2 ]

10 голосов
/ 21 февраля 2011

См. Официальную документацию, раздел 2.4.3.4., http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/, вы можете использовать @org.hibernate.annotations.Parent, чтобы дать объекту профиля обратный указатель на принадлежащий ему объект User и реализовать средство получения объекта пользователя.

@Embeddable
class Profile implements Serializable {

   @org.hibernate.annotations.Parent
   User user; // how to make this work?

   setURL(String url) {
      if (user.active() ) { // for this kind of usage
         // do something
      }
   }

   User getUser(){
       return this.user;
   }

   // .. other properties ..
}
7 голосов
/ 21 февраля 2011

Предполагая JPA, а не строго Hibernate, вы можете сделать это, применив @Embedded к паре получатель / установщик, а не к самому частному члену.

@Entity
class User implements Serializable {
   @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;

   @Access(AccessType.PROPERTY)
   @Embedded
   private Profile profile;

   public Profile getProfile() {
      return profile;
   }

   public void setProfile(Profile profile) {
      this.profile = profile;
      this.profile.setUser(this);
   }

   // ...
}

Однако я бы задал вопрос, является ли встроенная сущность тем, что вам нужно в этом случае, в отличие от отношения @OneToOne или просто "сглаживания" класса Profile в User. Основным аргументом в пользу @Embeddable является повторное использование кода, что маловероятно в этом сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...