2010-11-16 3 views
2

Tenir compte le tableau suivant:Est-il recommandé de synchroniser les propriétés de colonne redondantes avec des associations dans les implémentations JPA 1.0 @IdClass?

CREATE TABLE Participations 
(
    roster_id INTEGER NOT NULL, 
    round_id INTEGER NOT NULL, 
    ordinal_nbr SMALLINT NOT NULL , 
    was_withdrawn BOOLEAN NOT NULL, 
    PRIMARY KEY (roster_id, round_id, ordinal_nbr), 
    CONSTRAINT participations_rosters_fk FOREIGN KEY (roster_id) REFERENCES Rosters (id), 
    CONSTRAINT participations_groups_fk FOREIGN KEY (round_id, ordinal_nbr) REFERENCES Groups (round_id , ordinal_nbr) 
) 

Ici, la classe entité @IdClass JPA 1.0:

@Entity 
@Table(name = "Participations") 
@IdClass(value = ParticipationId.class) 
public class Participation implements Serializable 
{ 
    @Id 
    @Column(name = "roster_id", insertable = false, updatable = false) 
    private Integer rosterId; 

    @Id 
    @Column(name = "round_id", insertable = false, updatable = false) 
    private Integer roundId; 

    @Id 
    @Column(name = "ordinal_nbr", insertable = false, updatable = false) 
    private Integer ordinalNbr; 

    @Column(name = "was_withdrawn") 
    private Boolean wasWithdrawn; 

    @ManyToOne 
    @JoinColumn(name = "roster_id", referencedColumnName = "id") 
    private Roster roster = null; 

    @ManyToOne 
    @JoinColumns(value = {@JoinColumn(name = "round_id", referencedColumnName = "round_id"), @JoinColumn(name = "ordinal_nbr", referencedColumnName = "ordinal_nbr")}) 
    private Group group = null; 

    public Participation() 
    { 
    } 

    public Integer getRosterId() 
    { 
     return rosterId; 
    } 

    public void setRosterId(Integer rosterId) 
    { 
     this.rosterId = rosterId; 
    } 

    public Integer getRoundId() 
    { 
     return roundId; 
    } 

    public void setRoundId(Integer roundId) 
    { 
     this.roundId = roundId; 
    } 

    public Integer getOrdinalNbr() 
    { 
     return ordinalNbr; 
    } 

    public void setOrdinalNbr(Integer ordinalNbr) 
    { 
     this.ordinalNbr = ordinalNbr; 
    } 

    public Boolean getWasWithdrawn() 
    { 
     return wasWithdrawn; 
    } 

    public void setWasWithdrawn(Boolean wasWithdrawn) 
    { 
     this.wasWithdrawn = wasWithdrawn; 
    } 

    public Roster getRoster() 
    { 
     return roster; 
    } 

    // ??? 
    public void setRoster(Roster roster) 
    { 
     this.roster = roster; 
    } 

    public Group getGroup() 
    { 
     return group; 
    } 

    // ??? 
    public void setGroup(Group group) 
    { 
     this.group = group; 
    } 

    ... 
} 

En général, si les setters d'association synchroniser avec les champs redondants, ici rosterId, roundId et ordinalNbr ?:

// ??? 
    public void setGroup(Group group) 
    { 
     this.group = group; 
     this.roundId = group.getRoundId(); 
     this.ordinalNbr = group.getOrdinalNbr(); 
    } 

Merci

Répondre

3

Oui, ils devraient être synchronisés. Bien que, comme ils font partie de l'Id, vous ne devriez jamais les modifier, donc c'est vraiment un problème pour les nouveaux objets.

Si vous ne les gardez pas synchronisés, alors pour un nouvel objet, ils seront null/0, ce qui n'est probablement pas bon. Il n'y a pas de magie dans JPA qui gardera ces synchronisés pour vous. Si vous lisez l'objet de la base de données, alors il sera synchrone de grossier, mais vous êtes responsable de maintenir l'état de votre objet une fois en mémoire, y compris les champs dupliqués et les mappages bidirectionnels.

Si vous utilisez JPA 2.0, pourquoi ne pas en avoir du tout. Vous pouvez supprimer les routtersId et le roundId et ajouter simplement le @Id au @ManyToOnes.

+0

Pourquoi la clé primaire ne peut-elle pas être modifiée? Que se passe-t-il si une femme se marie et que le PK est une combinaison du prénom, du nom de famille et de la date de naissance? Je n'achète pas vraiment les arguments généraux que les PK ne peuvent pas changer. Les ID peuvent ne pas avoir à changer, mais c'est juste un type de PK ... – Kawu

Questions connexes