Persistance une liste d'éléments avec des clés composites

voix
0

J'utilise la persistance java pour enregistrer une liste d'entités qui sont associés à une autre entité. Voici un rapide aperçu de l'endroit où je vais avoir quelques problèmes.

@Entity public class Offer implements Serializable {
  @Id private Long offerId;

  @OneToMany
  @Column List<OfferCategory> offerCategories;
}

@Entity public class OfferCategory implements Serializable {

  @Embeddable public static class Id implements Serializable
  {
      @Column(name=offer_id)
      private Long offerId;

      @Column(name=category_id)
      private Long categoryId;

      public Id() {}

      public Id(Long offerId, Long categoryId) {
          this.offerId = offerId;
          this.categoryId = categoryId;
      }

      public boolean equals(Object o) {
          if(o != null && o instanceof Id) {
              Id other = (Id) o;
              return this.offerId.equals(other.offerId) &&
                      this.categoryId.equals(other.categoryId);
          }
          else
              return false;
      }

      public int hashCode() {
          return offerId.hashCode() + categoryId.hashCode();
      }
  }
  @EmbeddedId private Id id = new Id();
}

Pour l'essentiel, en raison d'une architecture que je ne peux pas changer, je dois enregistrer une liste de catégories étant attribué à une offre.

En ce moment, je reçois une liste des catégories de l'utilisateur, puis les mettre dans le champ offerCategories d'offre. Cependant, cela ne fonctionne pas pour les nouvelles offres, parce qu'il n'y a aucun moyen pour moi de définir l'ID d'un nouvel élément.

Je suis nouveau à JPA et Seam, donc si quelqu'un pouvait me donner un coup de coude dans la bonne direction, il serait grandement apprécié.

Créé 27/08/2009 à 00:26
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Eh bien, ma solution est maintenant que je persévère chacun (création de clés pour les nouvelles entrées), puis les choses dans une liste, puis les farcir dans leur objet conteneur, puis persister cet objet.

Créé 30/10/2009 à 21:47
source utilisateur

voix
0

Comme je l' ai regardé dans tutoriel , je trouve cela :

Vous ne pouvez pas utiliser IdentifierGenerator pour générer des clés composites. Au lieu de l'application doit assigner ses propres identifiants.

Donc , vous devez attribuer l'identifiant par vous - même. Peut - être que vous pouvez faire une séquence de DB et récupérer ses valeurs avec requête native?
Et une remarque - si vous voulez utiliser le mappage de la liste (ordre des catégories dans l' offre est définie par la base de données), vous avez besoin d' une colonne d'index pour contenir l'index dans la liste. Si l'ordre des catégories est pas important, Set serait plus pratique.

Créé 28/08/2009 à 15:44
source utilisateur

voix
0

Je ne l'ai pas essayé d'utiliser un identifiant composite avant, mais une chose à noter est que @Column est uniquement utilisé pour modifier les propriétés de la colonne de base de données le champ utilise. Il ne précise pas une relation, vous avez donc besoin encore quelque chose comme ceci:

@OneToMany    
List<OfferCategory> offerCategories;
Créé 27/08/2009 à 23:49
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more