Я постараюсь как можно коротким & объективно. Я использую JPA Eclipselink 2.5.2. После создания моей базы данных с помощью скрипта MySQL я пытаюсь ее заполнить. Компиляция дает мне следующее сообщение об ошибке:Ошибка JPA Eclipselink: «Поле« Target_id »не имеет значения по умолчанию»
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]
Я искал во всем и так, и Google, но даже когда я нахожу подобную ситуацию (например, this one), решения не похоже на работу (удаление а не null ограничений с помощью @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. Код
Хотя компилятор говорит ошибка возникает, когда диспетчер объектов звонит вровень (em.flush();
), я знаю, что другая линия связана с ошибкой, потому что если я комментирую это ошибка просто уходит : target.addExperiment(experiment);
(обратите внимание, что и цель, и эксперимент являются экземплярами объектов с тем же именем - при необходимости я могу разместить больше кода, но на данный момент я пытаюсь сделать вопрос не так долго). Таким образом, проблема заключается в двунаправленной связи между Target и Experiment, но помимо этого, я застрял в этой ошибке.
Итак, что код вызывает исключение? Вы установили цель эксперимента в значение, отличное от нуля? Кроме того, компилятор компилирует Java-код. Он не запускает его. –
Да, компилятор не запускает код, он просто компилирует его, это было несчастливое предложение. Что касается самой проблемы, оказалось, что, должно быть, Eclipse испортился после последовательных часов проб и ошибок. Сегодня он не дал никаких ошибок, и данные находятся в базе данных, я уже проверил его. – jaff