2013-11-14 2 views
0

OneToOne 관계가있는 두 개의 모델이 있습니다. 삽입 할 때 문제가 없지만 기본 모델을 업데이트하면 두 번째 모델에 새 행이 만들어집니다.Play Framework - 관계가있는 테이블 업데이트 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 나는 메소드 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(); 


    } 

에게 overwriter했다 그러나 나는 ORM을 사용하면 내가이 작업을 수행 할 필요가 없습니다해야한다고 생각합니다.

+0

컨트롤러 코드에서 첫 번째 모델 (Nodo)을 업데이트하는 코드를 표시하십시오. Empersa 만 볼 수 있습니다. – arbuzz

+0

하지만 그렇다면. 이 캐스케이드. 기본 모델만으로 충분하지 않습니까? – JohnPortella

+0

아니요, 엔티티를 어떻게 업데이트해야합니까? 예 : 'Nodo nodo = Nodo.find.where.eq ("id", 1) .findUnique(); nodo.smtn + = 1; nodo.save();' 아마도 모델 구현이 아니라 모델을 업데이트하는 코드의 문제 일 수 있습니다. – arbuzz

답변

1

submitForm.get()으로 Empersa 모델을 사용하고 있기 때문에 문제가 있다고 생각합니다. 어쩌면 코드를 디버깅하거나 로깅을 추가해야 할 수도 있지만 내 생각에 submitForm.get() 다음에 _empersa.geopunto에 ID가없는 것입니다. .save()을 평가하면 ORM이 Empersa를 업데이트 한 다음 geopunto에 ID가없고 삽입을 확인합니다.

는 어떻게 든 사용자가 empersa을 편집 할 수있는 페이지를 원하는 경우, 당신은이 empersageopunto의 ID를 통과해야 해당 사용자가 해당 페이지에서 editarEmpersa() 메서드에 전달이 두 개의 ID를 제출합니다. 여기에서 empersa의 ID 만 전달하면 geoPunto에 대해 동일한 로직이 필요합니다.