重复字段Hibernate + MySQL [Play 1.2.4]

时间:2013-04-01 16:14:00

标签: mysql jpa playframework

我有一个MySQL模型,有2个表 Empresa (公司)& Ruta (路线),1:N之间的关系。我正在使用NetBeans进行开发。

在运行我的应用程序之前,在MySQL命令行中输入:

describe ruta;

我的桌子ruta有3个字段:

idRuta  --  int(10) unsigned --  NONULL  --  PK  --  DEFAULTNULL  --  AUTOINC  
zona  --  varchar(45)  --  NO NULL  --  DEFAULTNULL --  
idEmpresa  -- int(11)  --  NONULL  --  KEYMUL  --  DEFAULTNULL  

当我运行我的webapp时,在添加任何对象之前,记录说:

[...]  
17:32:39,163 INFO  ~ Connected to jdbc:mysql://localhost:3306/opticaDB  
17:32:41,021 ERROR ~ Unsuccessful: alter table Ruta add index FK270C1013017BBD (empresa_idEmpresa), add constraint FK270C1013017BBD foreign key (empresa_idEmpresa) references Empresa (idEmpresa)  
17:32:41,021 ERROR ~ Can't create table 'opticadb.#sql-b0c_10' (errno: 150)  
17:32:41,344 INFO  ~ Application 'Optica2.0' is now started !  
17:32:55,235 WARN  ~ SQL Error: 1364, SQLState: HY000  
17:32:55,235 ERROR ~ Field 'idEmpresa' doesn't have a default value  
[...]
Ruta 中表 Empresa FK idEmpresa PK 。然后,当我的应用程序运行时,我输入

describe ruta;  

我的桌子ruta有四个字段:

idRuta  --  int(10) unsigned --  NONULL  --  PK  --  DEFAULTNULL  --  AUTOINC  
zona  --  varchar(45)  --  NONULL  --  DEFAULTNULL --  
idEmpresa  -- int(11)  --  NONULL  --  KEYMUL  --  DEFAULTNULL 
empresa_idEmpresa  --  bigint(20)  --  YESNULL  --  DEFAULTNULL

我的模特是这样的:

型号:Empresa

package models;    
import play.*;  
import java.util.*;  
import javax.persistence.*;  
import play.db.jpa.*;  
import play.data.validation.*;  

@Entity  
public class Empresa extends GenericModel {  

    @Id  
    @GeneratedValue (strategy = GenerationType.AUTO)  
    public Long idEmpresa;  

    public String nombre;  
    public Integer telefono;  
    public String web;  
    public String direccion;

    public String toString() {  
        return nombre;
    }  
}  

型号:Ruta

package models;

import play.*;
import java.util.*;
import javax.persistence.*;
import play.db.jpa.*;
import play.data.validation.*;

@Entity
public class Ruta extends GenericModel {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    public Long idRuta;
    public String zona;

    @ManyToOne
    public Empresa empresa;

    @Override
    public String toString(){
        return zona;
    }
}

关于这个问题的任何想法?

2 个答案:

答案 0 :(得分:0)

使用@JoinColumn指定您要使用idEmpresa列来映射ManyToOne关联:

@ManyToOne
@JoinColumn(name = "idEmpresa")
public Empresa empresa;

答案 1 :(得分:0)

如果您在框架启动之前定义了表,通常会出现问题。它是 DDL生成模式功能,您可以在application.conf文件中禁用它,我建议在生产模式下部署应用程序时将值设置为jpa.ddl=none

作为替代方案,如果您之前已经定义了表,特别是您已经定义了外键。你应该做这样的事情:

@Entity
public class Ruta extends GenericModel {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    public Long idRuta;
    public String zona;

    @ManyToOne
    @JoinColumn(name = "idEmpresa")
    public Empresa empresa;

    @Override
    public String toString(){
        return zona;
    }
}

请注意,新的注释@JoinColumn会在字段name中使用参数empresa(关联列名称)。有关详细信息,请参阅this reference

  

更新

     

JPA DDL UPDATE 无法删除或有时自动更新您的列(如果您之前已定义过该表)。或者,您可以为该表手动执行ALTER TABLE sql,或者如果您处于开发模式,删除上一个表是一种简单的方法。