当前位置: 首页 > 知识库问答 >
问题:

JPA Eclipselink错误:"字段'Target_id'没有默认值"

长孙文栋
2023-03-14

我会尽量短一点

异常在线程"main"javax.persistence.持久性异常:异常[Eclipse链接-4002](Eclipse持久性服务-2.5.2. v20140319-9ad6abd):org.eclipse.persistence.exceptions.数据库异常内部异常:java.sql.SQLExc0019:字段'Target_id'没有默认值错误代码: 1364调用:插入目标(32_bit_arch,IP,名称,Operating_system)值 (?, ?, ?, ?)绑定

我已经搜索了SO和Google,但即使我发现类似的情况(例如,这一个),解决方案似乎也不起作用(使用@JoinColumn(nullable=false)或appplying@OneToMany(orphanRemoving=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。附加实验(实验) (请注意,target和Experience都是同名实体的实例-如果需要,我可以发布更多代码,但现在我试图让问题不要太长)。所以问题似乎出在目标和实验之间的双向关联上,但除此之外,我被这个错误绊住了。


共有1个答案

庾奇思
2023-03-14

查看数据库中的表定义。

describe target

我猜,它与您在问题中显示的createtable语句不同。特别是,列target\u id的定义可能不会显示为auto\u increment

根据target\u id的定义,您可以使用

alter table target modify column target_id int not null auto_increment;
 类似资料:
  • 我会尽量简短客观。我使用的是JPA Eclipselink2.5.2。在用MySQL脚本创建数据库之后,我正在尝试填充它。编译给了我以下错误: 线程“main”javax.Persistence.persistenceException:异常[EclipseLink-4002](Eclipse Persistence Services-2.5.2.V20140319-9AD6ABD):org.Ec

  • 问题内容: 我的桌子看起来像 然后我有一个触发器来自动填充CREATED_BY字段 当我使用插入 该条目在表中进行,但我仍然收到错误消息 有没有一种方法可以抑制此错误,而又不使字段可为空并且不删除触发器?否则,我的hibernate状态将看到这些异常(即使已进行插入),然后应用程序将崩溃。 问题答案: 设置默认值(例如:empty ),触发器将始终更新该值。

  • 我的桌子看起来像 然后我有一个触发器来自动填充CREATED_BY字段 当我使用 表中有条目,但我仍然得到错误消息 有没有一种方法可以在不使字段为空和不移除触发器的情况下抑制此错误?否则,我的hibernate将看到这些异常(即使已经进行了插入),然后应用程序将崩溃。

  • 问题内容: 我刚刚从MAMP安装切换到本机Apache,MySql和PHP安装。我已经完成所有工作,但是我已经开始在新环境中使用Web应用程序,突然任何INSERT命令都会导致以下错误: SQLSTATE [HY000]:常规错误:1364字段“ display_name”没有默认值 看来我现在无法将字段留空。我正在使用MySql版本5.6.13 有没有办法在MySql中更改此设置? 问题答案:

  • 我不明白为什么我应用程序会删除异常“字段'ID_Employeer'没有默认值”。 是我的主键,当我试图将任何信息保存到我的数据库时,我得到了这个异常,但是,当我只是试图从DB读取信息时,它是正常的。 我读了关于StackOverflow的主题,但我仍然不明白我应用程序中的答案。我正在使用Hibernate5.2.11。 我的: 我的冬眠: 下一个CharacterInfo类 主类 最后例外

  • 问题内容: 我面对的是Hibernate遇到的一个简单问题,但无法解决(无法访问的Hibernate论坛当然无济于事)。 我有一个简单的课程想继续学习,但是请继续学习: 持久化类的相关代码为: 实际的运行代码很简单: 我在注解中尝试了一些“策略”,但似乎不起作用。初始化也无济于事!(例如)。 谁能给我一些启示? 编辑2: 确认:不能解决问题 求助: 重新创建数据库解决了问题 问题答案: 有时,即使