Spring 如何用最短的代码合并JPA中实体的新旧值?

Spring 如何用最短的代码合并JPA中实体的新旧值?,spring,hibernate,spring-data-jpa,Spring,Hibernate,Spring Data Jpa,我有两张表,客户和地址: 客户表: CREATE TABLE `customer` ( `customer_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `user_name` varchar(45) NOT NULL, `password` varchar(45) NOT NULL, `encrypt_key` varchar(200) NOT NULL, `first_name` varchar(45) NOT NUL

我有两张表,客户和地址:

客户表:

CREATE TABLE `customer` (
  `customer_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `encrypt_key` varchar(200) NOT NULL,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `email` varchar(50) DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `self_description` varchar(2000) NOT NULL,
  PRIMARY KEY (`customer_id`),
  KEY `idx_last_name` (`last_name`),
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8;
地址表:

CREATE TABLE `address` (
  `account_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `customer_id` smallint(5) unsigned NOT NULL,
  `address_type` varchar(15) NOT NULL,  -- Office, Branch-1, Branch-2, 
  `door_num` varchar(50) NOT NULL,
  `landmark` varchar(150) DEFAULT NULL,
  `street` varchar(50) DEFAULT NULL,
  `area_name` varchar(25) NOT NULL,
  `district` varchar(25) NOT NULL,
  `city` varchar(25) NOT NULL,
  `postal_code` varchar(10) DEFAULT NULL,
  `phone1` varchar(20) NOT NULL,
  `phone2` varchar(20),
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`account_id`),
  KEY `idx_fk_city` (`city`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8;
在Customer.java中

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "customer_id", nullable = false)
private List<Address> addresses;
在CustomerDaoImpl.java中

public boolean updateEntity(Customer customer) {

    session = sessionFactory.openSession();
    tx = session.beginTransaction();
    session.saveOrUpdate(customer);
    tx.commit();
    session.close();

    return false;
}
问题是我在做更新,每次都在创建新用户。但我必须更新客户及其孩子的地址和主题对象

我的请求机构:

    {
      "customerId": 102,
      "addresses": [
        {
          "accountId": 203,
          "addressType": "main office",
          "areaName": "area3",
          "city": "city3",
          "district": "district3",
          "doorNum": "89",
          "landmark": "landmark3",
          "phone1": "646432365465",
          "phone2": "4534542355675",
          "postalCode": "453245",
          "street": "street3"
        }
      ],
      "active": 1,
      "email": "bbb@gmail.com",
      "encryptKey": "wwwwwfsad",
      "firstName": "ccc",
      "lastName": "ddd",
      "password": "user2",
      "selfDescription": "user2",
      "userName": "user2",
      "theme": {
        "themeId": 402,
        "description": "theme2",
        "name": "theme2",
        "categoryId": 301
      }
    }

我必须做哪些更改?

如果要更新数据库中的记录:首先必须将记录从数据库检索到持久性上下文,然后更新其列值。我认为您试图直接更新数据库记录,这是错误的。它只是创建具有不同id的新对象并将其保存在数据库中

Customer retrievedCustomer = session.get(customer);

make you changes on retrievedCustomer...

session.update(retrievedCustomer);

如果要更新数据库中的记录:首先必须将记录从数据库检索到持久性上下文中,然后更新其列值。我认为您试图直接更新数据库记录,这是错误的。它只是创建具有不同id的新对象并将其保存在数据库中

Customer retrievedCustomer = session.get(customer);

make you changes on retrievedCustomer...

session.update(retrievedCustomer);

你能详细解释一下吗?在hibernate中,我们只需要对象,我的意思是hibernate只知道对象或实体。所以,要更新数据库中的记录,我们应该在hibernate上下文中将该记录作为对象检索,然后更新对象的字段并将其再次保存在数据库中。请您详细解释一下。在hibernate中,我们只需要对象,我的意思是hibernate只知道对象或实体。所以,要更新数据库中的记录,我们应该在hibernate上下文中将该记录作为对象检索,然后更新对象的字段并再次将其保存在数据库中。您需要先获取旧的客户实体,然后在客户中添加新数据,然后更新客户实体。就是这样。您需要先获取旧的客户实体,然后在客户实体中添加新数据,然后更新客户实体。就这样。