73 votes

JPA Plusieurs champs incorporés

Est-il possible pour une entité JPA pour contenir deux embedded (@Embedded) des champs? Un exemple serait:

@Entity
public class Person {
    @Embedded
    public Address home;

    @Embedded
    public Address work;
}

public class Address {
    public String street;
    ...
}

Dans ce cas, un Person peut contenir deux Address des cas, le domicile et le travail. Je suis en utilisant JPA Hibernate est mise en œuvre. Lorsque je génère le schéma de l'utilisation d'Hibernate Tools, il n'incorpore un Address. Ce que j'aimerais c'est deux incorporé Address des cas, chacune avec sa colonne de noms illustres ou pré-entrée avec certains préfixe (comme à la maison et au travail). Je ne connais @AttributeOverrides, mais cela nécessite que chaque attribut être remplacées individuellement. Cela peut devenir fastidieux si l'objet incorporé (Address) obtient grand que chaque colonne doit être remplacées individuellement.

80voto

Philihp Busby Points 1249

La méthode générique JPA consiste à utiliser @AttributeOverride. Cela devrait fonctionner à la fois dans EclipseLink et Hibernate.

 @Entity 
public class Person {
  @AttributeOverrides({
    @AttributeOverride(name="street",column=@Column(name="homeStreet")),
    ...
  })
  @Embedded public Address home;

  @AttributeOverrides({
    @AttributeOverride(name="street",column=@Column(name="workStreet")),
    ...
  })
  @Embedded public Address work;
  }

  @Embeddable public class Address {
    @Basic public String street;
    ...
  }
}
 

26voto

Loki Points 7801

Si vous voulez avoir le même intégrable type d'objet deux fois dans la même entité, le nom de la colonne défaut ne fonctionnent pas: au moins une des colonnes doivent être explicites. Hibernate va au-delà de la EJB3 spec et vous permet d'améliorer la défaillance du mécanisme par le biais du NamingStrategy. DefaultComponentSafeNamingStrategy est une petite amélioration par rapport à la valeur par défaut EJB3NamingStrategy qui permet à des objets incorporés à être en souffrance, même si elle est utilisée deux fois dans la même entité.

De Hibernate Annotations Doc: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e714

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X