Есть ли лучший способ клонировать модель для изменения только одной записи? - PullRequest
1 голос
/ 30 мая 2011

У меня есть модель с некоторыми полями, и я хотел бы добавить новую запись в база данных этой модели, но с изменением только одного поля. Есть лучший способ сделать это, без необходимости создавать новый экземпляр и устанавливать по одному в каждом поле?

Корпус:

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 Ответ

4 голосов
/ 30 мая 2011

Реализуйте интерфейс 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
...