【问题标题】:Spring-Hibernate: Insertion error, not-null constraint (One-to-many relationship)Spring-Hibernate:插入错误,非空约束(一对多关系)
【发布时间】:2014-10-08 10:07:25
【问题描述】:

我在这方面已经有一段时间了,但我找不到哪里出错了。我认为这是一些小错误和/或简单错误,第二双眼睛可能会很快发现它。

我正在构建一个由员工和工作组成的 MySQL 数据库。一个 Employee 可以有多个 Job,但一个 Job 只能有一个 Employee。

我使用 Liquibase 来构建我的数据库。这是我的变更集:

<changeSet id="0001" author="mparker" context="base">
    <comment>Creating Base Table</comment>
    <createTable tableName="employees" >
        <column name="employeeID" autoIncrement="true" type="int">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="firstname" type="varchar(50)">
            <constraints nullable="false"/>
        </column>
        <column name="lastname" type="varchar(50)">
            <constraints nullable="false"/>
        </column>
    </createTable>
</changeSet>
<changeSet id="0002" author="mparker">
    <createTable tableName="jobs" >
        <column name="jobID" autoIncrement="true" type="int">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="employer" type="varchar(50)">
            <constraints nullable="false"/>
        </column>
        <column name="employeeID" type="int">
            <constraints nullable="false"/>
        </column>
    </createTable>
</changeSet>

如您所见,我正在尝试创建两个表,其中每个条目都有自己的唯一标识符,当向表中添加新条目时,该标识符会自动递增。这些列永远不应该为空,因为值应该是前一个值 + 1。

这里是 Employee 和 Job 类的相关部分:

Employee.java:

@Entity
@Table(name = "employees")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "employeeID")
    private Long id;

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

    @Column(name = "lastname")
    private String lastName;
    @OneToMany(mappedBy = "employee", cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    private List<Job> jobList = new ArrayList<Job>();

    // getters and setters...
}

Job.java:

@Entity
@Table(name = "jobs")
public class Job {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "jobID")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "employeeID")
    private Employee employee;

    @Column(name = "employer")
    private String employer;

    // getters and setters...

}

以及用于保存员工的方法(使用自动装配的 EntityManager):

public void saveEmployee(String firstname, String lastname, List<Job> jobs) {
    Employee employee1 = new Employee();
    employee1.setJobList(jobs);
    employee1.setFirstName(firstname);
    employee1.setLastName(lastname);
    entityManager.persist(employee1);
}

这里是执行这个方法时抛出的异常:

[ERROR] 2014-08-14 11:33:51,561 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions - Column 'employeeID' cannot be null
[ERROR] 2014-08-14 11:33:51,603 com.sourceallies.webapp.exceptions.CustomHandlerExceptionResolver resolveException - could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

我不知道是什么原因造成的。不应该在每个条目上生成employeeID 吗?还是我把 Hibernate 搞砸了?

谢谢!

【问题讨论】:

  • 你用的是什么数据库?
  • MySQL,对不起,我应该指定这个。
  • 生成的表中的列是什么样子的?
  • @BranislavLazic 您可以查看 liquibase 变更集以了解我的目标。数据库现在完全是空的,因为我在尝试向其中插入东西时遇到了这个异常。
  • 你误会了,我问的是 COLUMNS 的样子。他们接受哪些数据类型。我不是在问是否插入了一些记录。我不熟悉 luquidbase。 xml 代码的第一个 sn-p 是否显示列的外观?

标签: java mysql hibernate spring-mvc liquibase


【解决方案1】:

想通了。

我的保存功能应该已将我正在创建的员工分配给每个工作:

public void saveEmployee(String firstname, String lastname, List<Job> jobs) {
    Employee employee1 = new Employee();
    employee1.setFirstName(firstname);
    employee1.setLastName(lastname);
    for (Job job : jobs) {
        job.setEmployee(employee1);
    }
    employee1.setJobList(jobs);
    entityManager.persist(employee1);
}

我还需要在我的工作表中的employeeID 列中添加一个外键约束:

<changeSet id="0003" author="mparker">
    <addForeignKeyConstraint 
        baseTableName="jobs"
        baseColumnNames="employeeID"
        constraintName="FK_jobs_employeeID_employees_employeeID"
        referencedTableName="employees"
        referencedColumnNames="employeeID"/>
</changeSet>

谢谢大家的建议。

【讨论】:

    猜你喜欢
    • 2012-02-20
    • 2022-01-14
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多