Считается ли наилучшей практикой синхронизировать избыточные свойства столбцов с ассоциациями в реализациях JPA 1.0 @IdClass? - PullRequest
2 голосов
/ 16 ноября 2010

Рассмотрим следующую таблицу:

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)
)

Здесь класс сущности JPA 1.0 @IdClass:

@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;
    }

    ...
}

В общем случае, если установщики ассоциации синхронизируются с избыточными полями, здесь rosterId, roundId и ordinalNbr?:

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

Спасибо

1 Ответ

3 голосов
/ 16 ноября 2010

Да, они должны быть синхронизированы. Хотя из-за того, что они являются частью идентификатора, их никогда не следует изменять, поэтому это действительно проблема только для новых объектов.

Если вы не будете синхронизировать их, то для нового объекта они будут равны нулю / 0, что, вероятно, не очень хорошо. В JPA нет магии, которая бы синхронизировала их для вас.

Если вы читаете объект из базы данных, то он будет синхронизирован грубо, но вы несете ответственность за сохранение состояния вашего объекта один раз в памяти, включая как повторяющиеся поля, так и двунаправленные отображения.

Если вы используете JPA 2.0, зачем вообще иметь дублирующиеся идентификаторы. Вы можете удалить routersId и roundId и просто добавить @Id в @ ManyToOnes.

...