2015-02-21 2 views
0

Я постараюсь как можно коротким & объективно. Я использую 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, но помимо этого, я застрял в этой ошибке.

+0

Итак, что код вызывает исключение? Вы установили цель эксперимента в значение, отличное от нуля? Кроме того, компилятор компилирует Java-код. Он не запускает его. –

+0

Да, компилятор не запускает код, он просто компилирует его, это было несчастливое предложение. Что касается самой проблемы, оказалось, что, должно быть, Eclipse испортился после последовательных часов проб и ошибок. Сегодня он не дал никаких ошибок, и данные находятся в базе данных, я уже проверил его. – jaff

ответ

1

Посмотрите на определение таблицы в вашей базе данных, например.

describe target 

Я думаю, он отличается от create table заявления, вы показали в этом вопросе. В частности, определение для столбца target_id может не отображаться как auto_increment.

В зависимости от определения target_id, вы можете изменить столбец с

alter table target modify column target_id int not null auto_increment; 
+0

Оказалось, что, должно быть, Eclipse испортился после последовательных часов проб и ошибок. Сегодня он не дал никаких ошибок, и данные находятся в базе данных, я уже проверил его. Кстати, 'описать цель', как ожидается, возвратил' auto_increment'. Спасибо за вашу помощь. – jaff

Смежные вопросы