Есть ли лучший способ клонировать модель для изменения только одной записи?
У меня есть модель с некоторыми полями, и я хотел бы добавить новую запись в базу данных этой модели, но с изменением только одного поля. Есть ли лучший способ сделать это, не создавая новый экземпляр и не устанавливая одно за другим каждое поле?
Случай:
public class MyModel extends Model {
public String firstname;
public String lastname;
public String city;
public String country;
public Integer age;
}
И код у меня на самом деле
MyModel user1 = MyModel.findById(1);
MyModel user2 = new MyModel();
// is there a way to do it with clone or user1.id = null ? and then create()?
// Actually, I do that :
user2.firstname = "John";
user2.lastname = user1.lastname;
user2.city = user1.city;
user2.country = user1.country;
user2.age = user1.age;
user2.create();
То, что я ищу, будет делать что-то вроде:
MyModel user1 = MyModel.findById(1);
MyModel user2 = clone user1;
user2.firstname = "John";
user2.create();
или же
MyModel user = MyModel.findById(1);
user.id = null;
user.firstname = "John";
user.create();
Но я не знаю, правильно ли так делать.
1 ответ
Решение
Реализовать Cloneable
интерфейс для сущности, а затем вызывающий clone()
Метод вернет поверхностную копию исходного объекта. Чтобы получить глубокую копию, переопределите ее, где вы можете установить идентификатор как null
& скопировать непримитивные поля.
@Override
protected Object clone() throws CloneNotSupportedException {
MyModel model = (MyModel) super.clone();
model.setId(null);
//-- Other fields to be altered, copying composite objects if any
return model.
}
Сохранение клонированного объекта:
MyModel user = MyModel.findById(1);
detachedUser = user.clone(); //-- cloning
user.firstname = "John"; //-- modifying
user.create(); //-- persisting