【问题标题】:Duplicated fields Hibernate + MySQL [Play 1.2.4]重复字段 Hibernate + MySQL [播放 1.2.4]
【发布时间】:2013-03-22 17:46:03
【问题描述】:

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

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

describe 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 是表 EmpresaPK 和表 Ruta 中的 FK。然后,在我的应用程序运行时,当我键入时

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

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

【问题讨论】:

标签: mysql jpa playframework


【解决方案1】:

如果您在框架启动之前定义了表,通常会发生此问题。这是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,它在字段 empresa 中采用参数 name(关联列名称)。如需进一步阅读,请参阅this reference

更新

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

【讨论】:

  • thx iwawiwi,我使用了你所说的,但它不起作用。 @JoinColumn 是的,但它不能解决重复问题。我还有一个额外的专栏,不知道为什么
  • 好的,您尝试删除您的表吗?我想,你还没有这样做。这是因为 jpa ddl update 无法自动删除您的列。作为替代方案,您可以手动执行 alter table sql。
  • 是的,它有效!非常感谢iwa,我已经有很多天遇到这个问题了。我认为原因是 Play,而不是 JPA。我使用了alter table drop 列。好的,解决了!
  • 好的,我很高兴知道您的问题已解决.. :) 如果此答案有用。请点击接受标志接受此答案.. :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多