Как обновить объект в Play framework?


Как изменить существующий объект в базе данных? Например, если у меня есть такая модель: class Topic{title,content,author}, когда я редактирую и сохраняю объект, я не хочу снова добавлять объект "автор". Как обновить существующий объект вместо добавления нового?

2 2

2 ответа:

Если вы наследуете от класса Model (как и должно быть), он предоставляет метод save(), а также атрибут ID. Когда вы вызываете save() на объект, который вы получили из базы данных, он будет обновлен, и если вы вызываете его на новый объект, он будет сохранен в базе данных. Это все автомагия!

Обновление только определенных полей

Model.save() сохраняет весь объект, поэтому, если вы хотите обновить только некоторые поля данных в вашем объекте, вам сначала нужно построить точный объект, который вы хотите зайдите в свою базу данных. Итак, предположим, что вы не хотите обновлять нулевые поля, используя свой объект Topic(id, content, author):

Topic newT = Topic(1L, 'yyy', null);
Long id = newT.getID();

Topic oldT = Topic.findByID(id);  //Retrieve the old values from the database

Author newAuthor = newT.getAuthor(); //null

if (newAuthor != null) {  //This test will fail
  oldT.setAuthor(newAuthor);  //Update the old object
}

String newContent = newT.getContent(); //Not null

if (newContent != null) {
  oldT.setContent(newContent);  //Update the old object
}

// Now the object oldT holds all the new, non-null data.  Change the update tests as you see fit, of course, and then...

oldT.save();  //Update the object in the database.

Вот как бы я это сделал. В зависимости от того, сколько полей у вас есть, этот код будет очень неуклюжим очень быстро. Определенно вложите это в метод. Кроме того, смотрите здесь о findByID() и других способах извлечения объектов из базы данных.

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

Это означает, что вы можете просто вызвать метод save().

Таким образом, действие контроллера может быть чем-то вроде

public static void editTopic(Topic topic) {
   topic.save();
   //...any post edit processing
}