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

Hibernate:使用复合键进行对象和实体身份映射的策略/模式?

  •  0
  • Kawu  · 技术社区  · 15 年前

    我想了几个小时,得出结论,一个字符串 全部的

    对于窗体的多列主键

    CREATE TABLE PlayerStats
    (
        game_id INTEGER,
        is_home BOOLEAN,
        player_id SMALLINT,
        roster_id SMALLINT,
        ... -- (game_id, is_home) FK to score, (player_id, roster_id) FK to team member
        PRIMARY KEY (game_id, is_home, player_id, roster_id)
    )
    

    @Override
    public int hashCode()
    {
        //                                                                 maxchars:
        String surrogate =   String.format("%011d", this.gameId)         //11
                           + String.format("%01d" , this.isHome ? 1 : 0) //1
                           + String.format("%011d", this.playerId)       //6
                           + String.format("%011d", this.rosterId)       //6
    
        System.out.println("surrogate = '" + surrogate + "'");
    
        return surrogate.hashCode();
    }
    

    当然,这只适用于hashset和Hashtable,而equals也基于此。

    我的问题是:这是一个好的总体战略吗?

    我可以看出,即时计算可能不是最快的。每当复合键值发生更改时,您可能需要重新计算哈希代码(例如,从对键属性进行操作的每个setter中调用rehash()方法)。

    欢迎提出建议和改进。这方面没有什么众所周知的策略吗?一种模式?

    1 回复  |  直到 15 年前
        1
  •  0
  •   btreat    15 年前

    哈希代码用作索引,用于查找数据集中具有相同代码的元素。然后使用equals方法在具有相同哈希代码的元素集中查找匹配项。因此,生成的哈希代码不必是100%唯一的。它只需要“足够独特”,以便在数据元素之间创建一个合适的分布,这样就不需要对大量具有相同hashCode值的项调用equals方法。