Play Framework — обновление таблиц с отношением OneToOne

У меня есть две модели с отношениями OneToOne. Когда я вставляю, нет проблем, но когда я обновляю основную модель, она создает новую строку во второй модели.

Мои модели.

Начальный

public class Nodo extends Model {

    @Id
    private int id;

    @Valid
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="GP_ID")
    private GeoPunto geopunto;

Среднее

@Entity
@Table(name="GeoPuntos")
public class GeoPunto extends Model{

    @Id
    private int id;

Мой контроллер:

public static Result editarEmpresa(Integer id){
        if(!Secured.permiso()){
            return ok(e403.render());
        }

        Form<Empresa> submitForm = empresaForm.bindFromRequest();
        if (submitForm.hasErrors()) return badRequest(nueva_empresa.render(submitForm));
        Empresa _empresa = submitForm.get();
        _empresa.setId(id);

        _empresa.update(Integer.parseInt(id + ""));

        Form<Empresa> empresaForm = form(Empresa.class).fill(_empresa);
        return ok(empresa.render(_empresa, empresaForm));
    }

Я надеюсь, что вы можете мне помочь.

ОБНОВЛЕНИЕ

Мне пришлось перезаписать метод UPDATE

@Override
    public void update() {
        String queryString = "UPDATE GEOPUNTOS SET " +
                " latitud = :lat," +
                " longitud = :long" +
                " where  id = :id";
        SqlUpdate query = Ebean.createSqlUpdate(queryString).setParameter("lat", this.getGeopunto().getLatitud())
                .setParameter("long", this.getGeopunto().getLongitud()).setParameter("id", this.getGeopunto().getId());

        int rows = query.execute();

        queryString = "UPDATE NODOS SET " +
                " direccion_referencial = :dr," +
                " ruc = :ruc, " +
                " nombre = :nom " +
                " where id = :id";

        query = Ebean.createSqlUpdate(queryString).setParameter("dr",this.getDireccionReferencial())
                .setParameter("ruc",this.getRuc()).setParameter("nom",this.getNombre())
                .setParameter("id", this.getId());

        rows = query.execute();


    }

но я думаю, что с помощью ORM мне не нужно этого делать.


person JohnPortella    schedule 14.11.2013    source источник
comment
Пожалуйста, покажите код, где вы обновляете свою первую модель (Nodo), в коде контроллера я вижу только Empersa.   -  person arbuzz    schedule 14.11.2013
comment
Но если это так. этот каскад. Разве недостаточно только основной модели?   -  person JohnPortella    schedule 14.11.2013
comment
Нет, мне нужно знать, как вы обновляете свою сущность. Например: Nodo nodo = Nodo.find.where.eq("id", 1).findUnique(); nodo.smtn += 1; nodo.save(); Возможно, проблема в коде, где вы обновляете модель, а не в реализации модели.   -  person arbuzz    schedule 15.11.2013
comment
Забыл сказать, что EMPRESA расширяет NODO, поэтому и поставил контроллер Empresa.   -  person JohnPortella    schedule 16.11.2013


Ответы (1)


Я думаю, что проблема в том, что вы получаете свою модель Empersa с submitForm.get(). Возможно, вам нужно отладить свой код или добавить ведение журнала, чтобы быть уверенным, но я предполагаю, что ваш _empersa.geopunto после submitForm.get() не имеет идентификатора. Вы оцениваете .save(), и ORM обновляет Empersa, затем обнаруживаете, что у геопунто нет идентификатора, и делаете вставку.

Если вам нужна страница, которая каким-то образом позволяет пользователю редактировать empersa, вам нужно передать туда идентификаторы empersa и geopunto, чтобы, если пользователь отправлял с этой страницы, эти два идентификатора передавались в метод editarEmpersa(). Здесь вы передаете только идентификатор empersa, вам нужна та же логика для geoPunto.

person arbuzz    schedule 18.11.2013