2013-11-14 42 views
0

我有兩個與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我不應該需要這樣做。

+0

請在控制器代碼中顯示更新第一個模型(Nodo)的代碼,我只能看到Empersa。 – arbuzz

+0

但是,如果是這樣。這個級聯。僅對主模型不夠? – JohnPortella

+0

不,我需要知道你如何更新你的實體。例如: 'Nodo nodo = Nodo.find.where.eq(「id」,1).findUnique(); nodo.smtn + = 1; nodo.save();' 也許在你更新模型的代碼中,而不是在模型實現中的問題。 – arbuzz

回答

1

我認爲這個問題是因爲你得到你的Empersa模型submitForm.get()。也許你需要調試你的代碼或添加日誌記錄來確保,但是我的假設是你的_empersa.geopuntosubmitForm.get()之後沒有id。您評估.save(),然後ORM更新Empersa,然後發現geopunto沒有ID並進行插入。

如果你想有一個網頁,不知怎的,允許用戶編輯empersa,你需要傳遞的empersageopunto IDS那裏,如果用戶從該頁面提交此兩個ID傳遞到editarEmpersa()方法。在這裏,您只傳遞empersa的ID,您需要使用與geoPunto相同的邏輯。