我有一个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
我的模特是这样的:
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;
}
}
关于这个问题的任何想法?
答案 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,或者如果您处于开发模式,删除上一个表是一种简单的方法。