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

休眠-保存实体-更新表-不基于主键

  •  3
  • walnutmon  · 技术社区  · 14 年前

    达到目的的伪代码:

    @Entity
    Person {
       @Id
       Integer id;
       String SSN;
       String name;
    }
    

    存储库或服务的用例:

    personRepository.save(new Person(ssn:"123456", name:"jeff")):
    
    • ID是唯一的和自动递增的主键
    • SSN是唯一的,是一个人的标识符
    • 名称只是一个字符串,可以更改

    当前保存使用休眠 merge() 进行插入/更新,但我没有 id 当我保存时(抽象层的一部分,这样客户机代码根本不需要接触实体),那么如果ssn已经存在于数据库中,而不需要对该字段进行单独的查找,那么如何更新人员名称,然后在其中进行分支逻辑(我不想这样做,因为我可能正在更新和插入许多人员一次E,认为会很慢)

    2 回复  |  直到 14 年前
        1
  •  1
  •   Pascal Thivent    14 年前

    如果ssn已经存在于数据库中,而不需要对该字段进行单独的查找,然后在其中进行分支逻辑(…)时,如何更新人员名称?

    我认为唯一的选择是使用ssn作为主键。

        2
  •  2
  •   apiri    14 年前

    您可以使用会话生成一个HQL查询,并沿着以下行滚动您自己的更新:

    String queryString = "update Person set name = :name where ssn = :ssn";
    Query query = session.createQuery(queryString);
    query.setString("name", newName);
    query.setString("ssn", ssn);
    query.executeUpdate();
    

    我不知道如何按照您的建议更新一个实体,因为Hibernate很大程度上依赖于您的@id字段来帮助确定持久状态。