Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠:检查对象是否存在/更改_Java_Database_Hibernate_Orm_Jpa - Fatal编程技术网

Java 休眠:检查对象是否存在/更改

Java 休眠:检查对象是否存在/更改,java,database,hibernate,orm,jpa,Java,Database,Hibernate,Orm,Jpa,假设我和一个人有个对象 long id String firstName String lastName String address 然后我在应用程序的某个地方生成一个Person对象。现在我想检查数据库中是否存在此人(=数据库中存在firstname/lastname组合)。如果没有=>插入它。如果是,请检查地址是否相同。如果没有=>更新地址 当然,我可以执行一些请求(首先,尝试使用firstname/lastname加载对象),然后(如果存在)比较地址。但难道没有更简单、更干净的方法吗?

假设我和一个人有个对象

long id
String firstName
String lastName
String address
然后我在应用程序的某个地方生成一个Person对象。现在我想检查数据库中是否存在此人(=数据库中存在firstname/lastname组合)。如果没有=>插入它。如果是,请检查地址是否相同。如果没有=>更新地址

当然,我可以执行一些请求(首先,尝试使用firstname/lastname加载对象),然后(如果存在)比较地址。但难道没有更简单、更干净的方法吗?如果得到了几个不同的类,不喜欢有这么多的查询

我想使用注释来表示: firstname/lastname=>它们是主键。检查对象是否存在

address是您必须比较的参数,它是否保持不变

Hibernate/JPA(或其他框架)是否支持类似的功能

伪码:

if (database.containsObject(person)) { //containing according to compound keys
     if (database.containsChangedObject(person)) {
              database.updateObject(person);
     }
} else {
     database.insertObject(person);
}
我想使用注释,好像在说:firstname/lastname=>它们是主键。检查对象是否存在

您可以使用以下两种注释之一声明复合主键:
@IdClass
@EmbeddedId
。有关更多详细信息,请查看

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


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

此人只是一个示例。但是在这种情况下,我不想插入两个名字/姓氏相同的人-我想检查名字/姓氏对的人是否存在,如果存在,不要插入,而是检查地址是否必须更新。哦,好的,我明白了。那么您只需要在复合键中输入firstname/lastname。但是如何比较这“三个”步骤呢?1.检查对象是否存在(比较复合键;示例中为:firstname/lastname)。2a.)对象不存在-插入-完成HD。2b.)对象存在-对象是否更改?(将对象与数据库中的对象进行比较)3)如果对象已更改-更新它,但我应该知道对象是否已更改;如果是,我想更新最新更新的列。。。