2010-04-19 5 views
2

J'ai trois tables. AvailableOptions et PlanTypeRef avec une table d'association ManyToMany appelée AvailOptionPlanTypeAssoc. Les schémas raccourcis ressemblent à ceci:JPA ManyToMany numéro de référence

CREATE TABLE [dbo].[AvailableOptions](
    [SourceApplication] [char](8) NOT NULL, 
    [OptionId] [int] IDENTITY(1,1) NOT NULL, 
    ... 
) 

CREATE TABLE [dbo].[AvailOptionPlanTypeAssoc](
    [SourceApplication] [char](8) NOT NULL, 
    [OptionId] [int] NOT NULL, 
    [PlanTypeCd] [char](2) NOT NULL, 
) 

CREATE TABLE [dbo].[PlanTypeRef](
    [PlanTypeCd] [char](2) NOT NULL, 
    [PlanTypeDesc] [varchar](32) NOT NULL, 
) 

Et le code Java ressemble à ceci. Le problème survient lorsque vous effectuez une sélection sur AvailableOptions, il se reconnecte à lui-même. Notez le code SQL suivant de la trace. La deuxième jointure interne doit être sur PlanTypeRef.

SELECT t0.OptionId, 
    t0.SourceApplication, 
    t2.PlanTypeCd, 
    t2.EffectiveDate, 
    t2.PlanTypeDesc, 
    t2.SysLstTrxDtm, 
    t2.SysLstUpdtUserId, 
    t2.TermDate 
FROM dbo.AvailableOptions t0 
    INNER JOIN dbo.AvailOptionPlanTypeAssoc t1 
    ON t0.OptionId = t1.OptionId AND t0.SourceApplication = t1.SourceApplication 
    INNER JOIN dbo.AvailableOptions t2 
    ON t1.PlanTypeCd = t2.PlanTypeCd 
WHERE (t0.SourceApplication = ? AND t0.OptionType = ?) 
ORDER BY t0.OptionId ASC, t0.SourceApplication ASC 
[params=(String) testApp, (String) junit0]} 

Répondre

3

Vous mappez une association bidirectionnelle. Cela signifie que vous devez choisir un côté en tant que propriétaire de l'association. Ce côté sera responsable de la mise à jour de la relation dans la base de données.

Si vous choisissez AvailableOption en tant que propriétaire de la relation et que vous souhaitez un nouveau type PlanType, vous devez ajouter le type de plan à l'option. L'ajout de l'option uniquement au type de plante n'aura aucun effet.

Voici la cartographie:

//AvailableOption.java 
@ManyToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER) 
@JoinTable(
    name = "AvailOptionPlanTypeAssoc", 
    joinColumns = { @JoinColumn(name = "OptionId"), 
        @JoinColumn(name="SourceApplication")}, 
    [email protected](name="PlanTypeCd")) 
List<PlanType> planTypes = new ArrayList<PlanType>(); 

//PlanType.java 
@ManyToMany(
    mappedBy = "planTypes" 
) 
List<AvailableOption> options = new ArrayList<AvailableOption>(); 

Vous pouvez également consulter les hibernate annotation documentation chapter 2.2.5

Cordialement David