代码之家  ›  专栏  ›  技术社区  ›  Kawu

在jpa 1.0@idclass实现中,将冗余列属性与关联同步是否被视为最佳做法?

  •  2
  • Kawu  · 技术社区  · 14 年前

    考虑下表:

    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 回复  |  直到 14 年前
        1
  •  3
  •   James    14 年前

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

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

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

    如果您使用的是JPA2.0,那么为什么还要麻烦使用重复的ID呢?您可以删除routersid和roundid,只需将@id添加到@manytoones。