【问题标题】:Is it considered a best practice to synchronize redundant column properties with associations in JPA 1.0 @IdClass implementations?将冗余列属性与 JPA 1.0 @IdClass 实现中的关联同步是否被认为是最佳实践?
【发布时间】:2011-05-10 18:56:27
【问题描述】:

考虑下表:

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();
    }

谢谢

【问题讨论】:

    标签: java orm jpa mapping


    【解决方案1】:

    是的,它们应该保持同步。尽管因为它们是 Id 的一部分,所以您永远不应该更改它们,所以这实际上只是新对象的问题。

    如果您不使它们保持同步,那么对于新对象,它们将为 null/0,这可能不好。 JPA 中没有任何魔法可以让您保持同步。

    如果您从数据库中读取对象,那么它们将粗略同步,但您有责任在内存中维护对象的状态,包括重复字段和双向映射。

    如果您使用的是 JPA 2.0,为什么还要使用重复的 ID。您可以删除 routersId 和 roundId,只需将 @Id 添加到 @ManyToOnes。

    【讨论】:

    • 为什么主键不能更改?如果一个女人结婚了,而 PK 恰好是名字、姓氏和出生日期的组合怎么办?我并不真正相信 PK 可能不会改变的一般论点。 ID 可能不必更改,但这只是 PK 的一种类型...
    猜你喜欢
    • 1970-01-01
    • 2014-03-25
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2011-10-28
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多