Зачем вставлять JPA null в базу данных

У меня есть таблица с датой последнего изменения. Я хочу установить это вручную в своей программе. Как ни странно, JPA правильно считывает объект и дата присутствует, поэтому ошибка столбца на самом деле невозможна. Однако, когда я сейчас создаю новый объект, появляется сообщение об ошибке, что JPA не может записать NULL в поле LastChange Date. (Перед persist () EntityManager я проверил, является ли дата NULL и существует ли она) Я использую WAS 9.0 и Eclipselink по умолчанию с JPA 2.1.


Здесь, в моем классе Testfall:

@Column(Name = "LetztesAenderungsdatum",insertable=true,updateable=true)
private java.sql.Date letztesAenderungsdatum

Схема таблицы

    CREATE TABLE Test
    (
        Testfall_Id             INT (7),
        LetztesAenderungsdatum  DATE NOT NULL,
        Name                    VARCHAR (25) NOT NULL,
        Verfahren_FK    INT CONSTRAINT Verfahren_FK REFERENCES 
        Verfahren(VERFAHREN_ID),
        CONSTRAINT testfall_Id PRIMARY KEY(Testfall_Id)
    );

перед тем, как Stack отслеживает Sysout с датой: [12.06.18 13: 45: 14: 415 CEST] 0000009f SystemOut O Testfall letztes Aenderungsdatum: 2018-06-12


трассировки стека:

    [12.06.18 13:45:25:289 CEST] 0000009f eclipselink   W   [eclipselink] Ausnahme [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.WAS-v20170717-04d37b5): org.eclipse.persistence.exceptions.DatabaseException
Interne Ausnahme: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: Einfügen von NULL in ("SCHEMA"."TESTFALL"."LETZTESAENDERUNGSDATUM") nicht möglich

Fehlercode: 1400
Aufruf: INSERT INTO SCHEMA.Testfall (Testfall_Id, Beschreibung, LetztesAenderungsdatum, Name, Verfahren_FK) VALUES (?, ?, ?, ?, ?)
    bind => [5 parameters bound]
Abfrage: InsertObjectQuery(myPackage.beans.Testfall@bcd7e11c)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
176
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не устанавливаете дату перед при вызове persist. Вы также можете включить nullable = false в свое отображение аннотаций.

вы, вероятно, хотите сделать что-то вроде этого:

@PreUpdate
protected void onUpdate() {
    letztesAenderungsdatum = new Date();
}

@PrePersist
protected void onPersist() {
    letztesAenderungsdatum = new Date();
}

Спасибо! Это экономит мне код, но я все равно получаю то же сообщение об ошибке. Я также пробовал nullable = false, но это не работает. Тогда я все еще получаю то же сообщение об ошибке.

user9093464 12.06.2018 14:06

`public void speichere (Testfall testfall) {System.out.println (" Testfall hat das Aenderungsdatum: "+ testfall.getLetztesAenderungsdatum ()); beginneTransaktion (); если (pruefeNeu (testfall)) {this.getManager (). persist (testfall); } еще {this.getManager (). merge (testfall); } wasdeTransaktion (); если (this.getManager (). содержит (testfall)) {this.getManager (). refresh (testfall); } else {System.out.println ("Testfall wurde nicht gespeichert"); }} `

user9093464 12.06.2018 14:11

Когда вы звоните this.getManager().persist(testfall);, дата в данный момент нулевая? С помощью приведенного выше кода в основном гарантируется, что дата никогда не будет нулевой. Какого провайдера организации вы используете? EclipseLink? Спящий режим? Вы сами создали схему или она была сгенерирована?

Guilherme Mussi 12.06.2018 14:18

Когда я вызываю метод persist (), объект Date существует. Вывод находится над трассировкой стека. Это не должно быть проблемой. Я уже написал, каким провайдером пользуюсь. Я использую стандартный поставщик EclipseLink для WAS 9. Хотя теперь я получаю ноль, потому что использую аннотацию PrePersist и устанавливаю там дату. @PreUpdate protected void onUpdate(){ letztesAenderungsdatum = new Date(Calendar.getInstance().getTime().getTime()); } @PrePersist protected void onPersist(){ letztesAenderungsdatum = new Date(Calendar.getInstance().getTime().getTime()); }

user9093464 12.06.2018 14:31

хорошо, теперь работает. В моем проекте была еще одна ошибка. Спасибо!

user9093464 12.06.2018 14:44

Большой! Я пытался понять, что могло быть не так. Пожалуйста, тогда проголосуйте за / примите мой ответ, хорошо? Спасибо.

Guilherme Mussi 12.06.2018 14:47

Другие вопросы по теме