mysql - JPA Eclipselink错误: "Field ' Target_id' doesn't have a default value"

标签 mysql jpa eclipselink

我会尽量做到简短和客观。我正在使用 JPA Eclipselink 2.5.2。使用 MySQL 脚本创建数据库后,我尝试填充它。编译出现以下错误:

Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: Field 'Target_id' doesn't have a default value Error Code: 1364 Call: INSERT INTO TARGET (32_bit_arch, IP, Name, Operating_system) VALUES (?, ?, ?, ?) bind => [true, 127.0.0.1, Intel i7 2.6 Ghz + 8 GB, CentOS 6.5 32 bit]

我已经在SO和Google上进行了搜索,但即使我发现类似的情况(例如 this one ),解决方案似乎也不起作用(使用 @JoinColumn(nullable = false 删除非空约束) )或应用 @OneToMany(orphanRemoval=true) 等)。相关信息如下:

<强>1。 MySQL建表脚本:

-- -----------------------------------------------------
-- Table `fault_injector`.`Target`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `fault_injector`.`Target` ;

CREATE TABLE IF NOT EXISTS `fault_injector`.`Target` (
  `Target_id` INT NOT NULL AUTO_INCREMENT,
  `Name` VARCHAR(30) NOT NULL,
  `32_bit_arch` TINYINT(1) NOT NULL,
  `IP` VARCHAR(15) NOT NULL,
  `Operating_system` VARCHAR(30) NOT NULL,
  PRIMARY KEY (`Target_id`),
  UNIQUE INDEX `idTarget_UNIQUE` (`Target_id` ASC),
  UNIQUE INDEX `IP_UNIQUE` (`IP` ASC))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `fault_injector`.`Experiment`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `fault_injector`.`Experiment` ;

CREATE TABLE IF NOT EXISTS `fault_injector`.`Experiment` (
  `Exp_id` INT NOT NULL AUTO_INCREMENT,
  `Creator_id` INT NOT NULL,
  `Target_id` INT NOT NULL,
  `Name` VARCHAR(30) NOT NULL,
  `Creation_date` TIMESTAMP NOT NULL,
  `Injection_date` TIMESTAMP NULL,
  `Description` VARCHAR(300) NOT NULL,
  PRIMARY KEY (`Exp_id`),
  UNIQUE INDEX `Experiment_id_UNIQUE` (`Exp_id` ASC),
  INDEX `Target_id_idx` (`Target_id` ASC),
  INDEX `User_id_idx` (`Creator_id` ASC),
  CONSTRAINT `Experiment_User_id_fk`
    FOREIGN KEY (`Creator_id`)
    REFERENCES `fault_injector`.`User` (`User_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Experiment_Target_id_fk`
    FOREIGN KEY (`Target_id`)
    REFERENCES `fault_injector`.`Target` (`Target_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

<强>2。目标实体:

@Entity
@NamedQuery(name="Target.findAll", query="SELECT t FROM Target t")
public class Target implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="Target_id")
    private int target_id;

    [...]

    //bi-directional many-to-one association to Experiment
    @OneToMany(mappedBy="target")
    private List<Experiment> experiments;

    [...]

    public List<Experiment> getExperiments()
    {
        if(this.experiments==null)
            this.experiments = new ArrayList<Experiment>();

        return this.experiments;
    }

    public Experiment addExperiment(Experiment experiment) {
        getExperiments().add(experiment);
        experiment.setTarget(this);

        return experiment;
    }

<强>3。实验实体:

@Entity
@NamedQuery(name="Experiment.findAll", query="SELECT e FROM Experiment    e")
public class Experiment implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="Exp_id")
    private int exp_id;

    [...]

    //bi-directional many-to-one association to Target
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="Target_id")
    private Target target;

    [...]

    public void setTarget(Target target) {
        this.target = target;
    }

<强>4。代码

虽然编译器说当实体管理器调用flush (em.flush();)时发生错误,但我知道另一行与该错误相关,因为如果我注释它错误就消失了: target.addExperiment(experiment); (请注意,目标和实验都是具有相同名称的实体的实例 - 如果需要,我可以发布更多代码,但现在我我试图让问题不那么长)。所以看来问题出在目标和实验之间的双向关联上,但除此之外,我还遇到了这个错误。

最佳答案

查看数据库中的表定义,例如

describe target

我想,它与您在问题中显示的create table语句不同。特别是,target_id 列的定义可能不会显示为 auto_increment

根据 target_id 的定义,您可以使用

修改该列
alter table target modify column target_id int not null auto_increment;

关于mysql - JPA Eclipselink错误: "Field ' Target_id' doesn't have a default value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28649895/

相关文章:

PHP 将正则表达式结果插入数据库

php - android + mysql + 登录

mysql - 最喜欢的照片

java - 如何访问 JPQL 查询结果的对象数组列表

java - 为什么 EclipseLink 将 NVARCHAR 类型映射到对象?

php - MATCH (somefeald) AGAINST ('+".$_GET ['search' ] ."' 在 bool 模式下) 不起作用

java - Hibernate 如何与规范化数据库一起工作?

java - 了解实体映射到数据库 View 的删除或更新

java - 如何将 EclipseLink 对象导出到 XML

java - EclipseLink 分布式缓存导致主键为空,什么?