定义映射时出现休眠异常

Posted

技术标签:

【中文标题】定义映射时出现休眠异常【英文标题】:Hibernate Exception while defining mapping 【发布时间】:2013-09-12 18:43:01 【问题描述】:

我正在做一个项目并使用 Hibernate 进行数据库交互。

我有两张桌子,一张是RESOURCE_PROFILE,第二张是PROJECT_MASTER。以下是 DDL 语句。

CREATE TABLE USER_PROFILE (
    FIRST_NAME VARCHAR(15) NOT NULL,
    MIDDLE_NAME VARCHAR(15),
    LAST_NAME VARCHAR(15) NOT NULL,
    EMAIL_ID VARCHAR(40) NOT NULL,
    USER_ID VARCHAR(40) NOT NULL,
    PASSWORD VARCHAR(1000) NOT NULL,
    ROLE VARCHAR(20),
    SUPERVISOR_ID VARCHAR(20),
    SUBMITTED_BY VARCHAR(20),
    SUBMITTED_DATE DATE,
    PRIMARY KEY (USER_ID)
);

CREATE TABLE PROJECT_MASTER (
    PROJECT_ID INT NOT NULL AUTO_INCREMENT,
    PROJECT_NAME VARCHAR(50) NOT NULL,
    PROJECT_NUMBER VARCHAR(50) NOT NULL,
    START_DATE DATE,
    END_DATE DATE,
    PROJECT_MANAGER_ID VARCHAR(40) NOT NULL,
    PROJECT_SUPERVISOR_ID VARCHAR(40) NOT NULL,
    SUBMITTED_BY VARCHAR(40),
    SUBMITTED_DATE DATE,
    UPDATED_BY VARCHAR(40),
    PRIMARY KEY (PROJECT_ID),
    FOREIGN KEY (PROJECT_MANAGER_ID) REFERENCES USER_PROFILE(USER_ID),
    FOREIGN KEY (PROJECT_SUPERVISOR_ID) REFERENCES USER_PROFILE(USER_ID),
    FOREIGN KEY (SUBMITTED_BY) REFERENCES USER_PROFILE(USER_ID),
    FOREIGN KEY (UPDATED_BY) REFERENCES USER_PROFILE(USER_ID)
);

正如您在PROJECT_MASTER 表中所见,我使用USER_ID(RESOURCE_PROFILE) 作为PROJECT_MASTER 表中多个列的外键。下面是我为这两个表创建的实体类。我确定我在映射中做错了什么,你能帮我指出正确的方向吗? 由于我有相同的外键用于多个列,我该如何实现这种映射?

    @Entity
    @Table(name = "PROJECT_MASTER")
    public class ProjectMasterBean  

      @Id
      @GeneratedValue
      @Column(name="PROJECT_ID")
      private int projectID;

      @Column(name="PROJECT_NAME")
      private String projectName;

      @Column(name="PROJECT_NUMBER")
      private String projectNumber;

      @Column(name="START_DATE")
      private Date startDate;

      @Column(name="END_DATE")
      private Date endDate;

      @ManyToOne
     @JoinColumn(name="USER_ID",insertable=false, updatable=false,
            nullable=false)
      private UserProfileBean projectManagerID;

      @ManyToOne
     @JoinColumn(name="USER_ID",insertable=false, updatable=false,
            nullable=false)
      private UserProfileBean projectSupervisorID;

      @ManyToOne
    @JoinColumn(name="USER_ID",insertable=false, updatable=false,
            nullable=false)
      private UserProfileBean submittedBy;
    

      @Column(name="SUBMITTED_DATE")
      private Date submittedDate;

      @ManyToOne
    @JoinColumn(name="USER_ID",insertable=false, updatable=false,
            nullable=false)
      private UserProfileBean updatedBy;


     public class UserProfileBean  
    @Id
      @Column(name="USER_ID")
      private String userID;

      @Column(name="FIRST_NAME")
      private String firstName;

      @Column(name="MIDDLE_NAME")
      private String middleName;

      @Column(name="LAST_NAME")
      private String lastName;

      @Column(name="EMAIL_ID")
      private String emailID;

      @Column(name="PASSWORD")
      private String password;

      @Column(name="ROLE")
      private String userRole;

      @Column(name="SUPERVISOR_ID")
      private String supervisorID;

      @Column(name="SUBMITTED_BY")
      private String submittedBy;

      @Column(name="SUBMITTED_DATE")
      private String submittedDate;

这是我得到的例外:

休眠:插入 PROJECT_MASTER(PROJECT_NAME、PROJECT_NUMBER、START_DATE、END_DATE、SUBMITTED_BY、SUBMITTED_DATE、UPDATED_BY)值(?、?、?、?、?、?、?) 2013 年 9 月 12 日晚上 8:46:20 org.apache.catalina.core.StandardWrapperValve 调用 严重:Servlet 操作的 Servlet.service() 引发异常

java.sql.SQLException: Field 'PROJECT_MANAGER_ID' doesn't have a default value
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)

插入查询甚至没有这两列。查询应该是这样的。

休眠:插入 PROJECT_MASTER(PROJECT_NAME、PROJECT_NUMBER、START_DATE、END_DATE、PROJECT_MANAGET_ID、PROJECT_SUPERVISOR_ID、SUBMITTED_BY、SUBMITTED_DATE、UPDATED_BY)值(?、?、?、?、?、?、?、?、?)

【问题讨论】:

【参考方案1】:

你已经用

创建了你的表

创建表 PROJECT_MASTER ( PROJECT_ID INT NOT NULL AUTO_INCREMENT, PROJECT_NAME VARCHAR(50) 非空,PROJECT_NUMBER VARCHAR(50) 非 NULL,START_DATE DATE,END_DATE DATE,PROJECT_MANAGER_ID VARCHAR(40) 非空,PROJECT_SUPERVISOR_ID VARCHAR(40) 非空,SUBMITTED_BY VARCHAR(40)、SUBMITTED_DATE 日期、UPDATED_BY VARCHAR(40)、主键 (PROJECT_ID), 外键 (PROJECT_MANAGER_ID) 参考 USER_PROFILE(USER_ID),外键 (PROJECT_SUPERVISOR_ID) 参考 USER_PROFILE(USER_ID), FOREIGN KEY (SUBMITTED_BY) REFERENCES USER_PROFILE(USER_ID), FOREIGN KEY (UPDATED_BY) REFERENCES USER_PROFILE(USER_ID) );

你已经让你的班级使用这个表。因为您没有 NOT NULL 字段的默认值,所以 Hibernate 会抱怨。从表中删除该列或在实体映射中添加关系。

改成

@ManyToOne
@JoinColumn(name="PROJECT_MANAGER_ID ",insertable=false, updatable=false,
        nullable=false)
private UserProfileBean projectManagerID;

【讨论】:

我想在表中有这些列,我需要将项目经理和项目主管的用户 ID(来自资源表)存储在该表中。 这就是问题所在,如何或在实体类中添加关系。 @user2773890 错过了。添加了一个编辑。 @JoinColumn 上的 name 属性是当前表上作为外键的列的名称。转至PROJECT_MANAGER_ID 即使我添加了 'Project_Manager_ID',hibernate 是如何知道它需要添加不同表的 USER_ID 的? @user2773890 您必须对所有引用其他实体的列执行相同的操作。 Hibernate 有默认值。它将检查字段的类型,例如。 UserProfileBean。然后它将查看该类以查看它是否为@Entity 并映射到其@Id 字段,然后它可以知道由于@Column 注释而映射到USER_ID

以上是关于定义映射时出现休眠异常的主要内容,如果未能解决你的问题,请参考以下文章

添加ORDER BY时出现“SQL0802 - 数据映射错误的数据转换”异常

休眠映射异常:实体映射中的重复列

格瑞斯 GORM。将映射添加到现有的休眠映射

插入到自动映射生成的 ORM 时出现 SQLAlchemy InvalidRequestError

休眠映射异常:无法确定类型

休眠映射异常:无法确定列的类型