2011-10-18 5 views
0

Je convertis la configuration d'Hibernate en JPA. La configuration actuelle a une classe AlertPref (table ALERT_PREF) avec une collection de types longs qui sont des valeurs de clé primaire de la table ALERT_CATEGORY. Il existe une table de jonction ALERT_PREF_CATEGORY qui joint les deux. Je pourrais configurer cette relation dans JPA en définissant la table de jonction en tant que classe Entity et en ayant une collection d'objets AlertPrefCategory au lieu de Long IDs dans la classe AlertPref, mais je veux éviter cela si possible, et configurer un mappage unidirectionnel à partir de AlertPref aux identifiants longs. Une partie du code existant utilise les ID, et il serait difficile de changer ce code.Mappage d'une association OneToMany unidirectionnelle sur un objet wrapper à l'aide de JPA

Voici la balise de classe actuelle dans la configuration Hibernate, qui fonctionne très bien:

<class name="AlertPref" table="ALERT_PREF"> 
    <id name="alertPrefId" column="ALERT_PREF_ID" type="long"> 
     <generator class="hilo"> 
      <param name="max_lo">100</param> 
     </generator> 
    </id> 

    <property name="userId" column="USER_ID" type="string" 
     not-null="true" /> 

    <set name="excludedCategoryIds" table="ALERT_PREF_CATEGORY" cascade="all,delete-orphan"> 
     <key column="ALERT_PREF_ID" /> 
     <element column="EXCLUDED_CATEGORY_ID" type="long" /> 
    </set> 

</class> 

Voici ce que j'essayé d'utiliser JPA, mais il jette l'exception « Utilisation de @OneToMany ou @ManyToMany ciblage une classe unmapped: AlertPref.excludedCategoryIds [java.lang.Long] »

@Entity 
@Table(name = "ALERT_PREF") 
public class AlertPref { 
    @Id 
    @TableGenerator(name = "table_gen", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "table_gen") 
    @Column(name = "ALERT_PREF_ID") 
    private long alertPrefId; 

    @Column(name = "USER_ID", nullable = false) 
    private String userId; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinTable(name = "ALERT_PREF_CATEGORY", 
     joinColumns = @JoinColumn(name = "ALERT_PREF_ID"), 
     inverseJoinColumns = @JoinColumn(name = "EXCLUDED_CATEGORY_ID")) 
    private Set<Long> excludedCategoryIds; 

    /** 
    * @return Returns the alertPrefId. 
    */ 
    public long getAlertPrefId() { 
     return alertPrefId; 
    } 

    /** 
    * @param alertPrefId 
    *   The alertPrefId to set. 
    */ 
    public void setAlertPrefId(long alertPrefId) { 
     this.alertPrefId = alertPrefId; 
    } 

    /** 
    * @return Returns the userId. 
    */ 
    public String getUserId() { 
     return userId; 
    } 

    /** 
    * @param userId 
    *   The userId to set. 
    */ 
    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    /** 
    * @return the excludedCategoryIds 
    */ 
    public Set<Long> getExcludedCategoryIds() { 
     return excludedCategoryIds; 
    } 

    /** 
    * @param excludedCategoryIds the excludedCategoryIds to set 
    */ 
    public void setExcludedCategoryIds(Set<Long> excludedCategoryIds) { 
     this.excludedCategoryIds = excludedCategoryIds; 
    } 
} 

Répondre

0

Vous devez utiliser les ElementCollection et les annotations CollectionTable, comme cela est expliqué dans le Hibernate reference documentation.

+0

Je suppose que si je veux faire une opération en cascade, alors je devrais définir une entité pour représenter la table de jonction - est-ce correct? – acvcu

+0

Non. Une collection contenant des types de base ou des composants incorporés a le même cycle de vie que l'entité qui la détient. Ainsi, la création d'un ID contenant AlertPref créera les lignes dans la table de jointure. La modification de l'ensemble modifiera les lignes en conséquence. Et la suppression de l'entité supprimera les lignes dans la table de jointure. –

+0

Comment puis-je noter une cascade et un retrait d'orphelin? Ce ne sont pas une option sur ElementCollection ou CollectionTable. Si je supprime une colonne AlertPref, je souhaite que toutes les colonnes dans AlertPrefCategory référençant le AlertPref soient supprimées pour maintenir l'intégrité référentielle. – acvcu

Questions connexes