2015-12-14 1 views
1

У меня есть две таблицы: клиента и адрес:JPA - OneToMany - Как объединить старые и новые значения объекта в 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 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; 

В Адрес.java Относительно клиента, потому что я использую uni-directction.

В 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": "[email protected]", 
     "encryptKey": "wwwwwfsad", 
     "firstName": "ccc", 
     "lastName": "ddd", 
     "password": "user2", 
     "selfDescription": "user2", 
     "userName": "user2", 
     "theme": { 
     "themeId": 402, 
     "description": "theme2", 
     "name": "theme2", 
     "categoryId": 301 
     } 
    } 

Просьба направить меня, что и все изменения, которые я должен сделать.

+0

Необходимо сначала получить старшую клиентскую сущность, а затем добавить новые данные в клиенте, а затем обновить объект клиента. Вот и все. –

ответ

0

Если вы хотите обновить запись в базе данных: сначала вам нужно восстановить свою запись из базы данных в Контекст сохранения, а затем обновить значения столбцов. Я думаю, что вы пытаетесь напрямую записывать записи базы данных, и это неправильно. Он просто создает новый объект с другим идентификатором и сохраняет его в базе данных.

Customer retrievedCustomer = session.get(customer); 

make you changes on retrievedCustomer... 

session.update(retrievedCustomer); 
+0

вы можете объяснить мне более подробно пожалуйста. – Sun

+0

В спящем режиме нам просто нужны объекты, которые означают, что hibernate просто знает объекты или объекты. поэтому для обновления записи в базе данных мы должны извлечь эту запись в качестве объекта в контексте hibernate, затем обновить поля объекта и сохранить его снова в базе данных. – samadadi