1

我有一个 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  
[...]

idEmpresa是表Ruta中表EmpresaFK的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;
    }  
}  

型号:鲁塔

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;
    }
}

对这个问题有任何想法吗?

4

2 回答 2

0

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

@ManyToOne
@JoinColumn(name = "idEmpresa")
public Empresa empresa;
于 2013-04-05T07:11:01.913 回答
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;
    }
}

请注意,有一个新注释在 field@JoinColumn采用参数name(关联列名称)empresa。请参阅此参考以进一步阅读。

更新

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

于 2013-04-05T07:13:32.930 回答