【问题标题】:Hibernate: Check if object exists/changed休眠:检查对象是否存在/更改
【发布时间】:2011-01-06 13:26:49
【问题描述】:

假设我有一个对象 Person

long id
String firstName
String lastName
String address

然后我在我的应用程序的某处生成一个人对象。现在我想检查这个人是否存在于数据库中(= 名字/姓氏组合在数据库中)。如果不是 => 插入它。如果是,请检查地址是否相同。如果不是 => 更新地址。

当然,我可以做一些请求(首先,尝试使用名字/姓氏加载对象),然后(如果存在),比较地址。但是没有更简单、更清洁的方法吗?如果有几个不同的类并且不喜欢有这么多的查询。

我想用注解好像在说: 名字/姓氏 => 他们是主键。如果对象存在,请检查它们。

地址是你必须比较的参数,如果它保持不变。

Hibernate/JPA(或其他框架)是否支持类似的东西?

伪代码:

if (database.containsObject(person)) { //containing according to compound keys
     if (database.containsChangedObject(person)) {
              database.updateObject(person);
     }
} else {
     database.insertObject(person);
}

【问题讨论】:

    标签: java database hibernate orm jpa


    【解决方案1】:

    我想使用注释,就好像在说:名字/姓氏 => 它们是主键。如果对象存在,请检查它们。

    您可以使用以下两个注释之一声明复合主键:@IdClass@EmbeddedId。更多详情,请查看Compound Primary Keys with Hibernate and JPA Annotations

    但是,如果您希望能够插入两个具有相同名字/姓氏和不同地址的人,则必须在密钥中包含地址。

    请注意,最佳做法是使用数字代理主键,即仅用作标识符且在应用程序中没有业务意义的主键。

    【讨论】:

    • 这个人只是一个例子。但在这种情况下,我不想插入两个名字/姓氏相同的人 - 我想检查一个名字/姓氏相同的人是否存在,如果是,不要插入但检查地址是否必须更新.
    • 哦,好的,我明白了。然后你只需要复合键中的名字/姓氏。
    • 但是我该如何比较这“三个”步骤呢? 1. 检查对象是否存在(比较复合键;在示例中:名字/姓氏)。 2a.) 对象不存在 - 插入 - 完成。 2b.) 对象存在 - 对象改变了吗? (将对象与数据库中的对象进行比较)3)如果对象更改 - 更新它
    • 但是我应该知道对象是否改变了;如果是,我想更新一个 lastUpdated 列...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多