Проблема преобразования LocalDate в дату в спящем режиме: ORA-00932: несогласованные типы данных: должно быть: Получено ЧИСЛО: ДВОИЧНОЕ - PullRequest
0 голосов
/ 14 июля 2020

Я получаю сообщение об ошибке в проекте Hibernate. Существует класс Kisi . Вот структура классов моего проекта:

Kisi entity:

@Entity
@Table(name = "KISI" )
public class Kisi implements java.io.Serializable {

/**
 * 
 */
private static final long serialVersionUID = 3283201458992402052L;

@Id
@Column(name = "ANAHTAR")   
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "kisi_Sequence")
@SequenceGenerator(name = "kisi_Sequence", sequenceName = "KISI_SEQ" , allocationSize = 1)
private int anahtar;

@ManyToOne(fetch = FetchType.LAZY, cascade= {CascadeType.ALL}) 
@JoinColumn(name = "UNVANANAHTAR", nullable = true)
private Unvan unvani;

@Column(name = "ADI", columnDefinition = "VARCHAR2(700 Byte)", nullable = false)
private String adi;

@Column(name = "SOYADI", columnDefinition = "VARCHAR2(1000 Byte)", nullable = false)
private String soyadi;

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
private Kimlik kimligi;

@Column(nullable = true)
private LocalDate dogumTarihi;

@Enumerated
@Column(name="CINSIYET", columnDefinition = "smallint", nullable = true)     
private Cinsiyet cinsiyeti;

@Enumerated
@Column(name="MEDENIDURUMU", columnDefinition = "smallint", nullable = true)
private MedeniDurum medeniDurumu;

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
private KisiDetay kisiDetay;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "kisisi")
private Set<KisiIletisim> iletisimKumesi;

public Kisi() {
    
    super();
    String bosSozce = Sabit.BOSSOZCE;
    
    this.anahtar = Integer.MIN_VALUE;
    this.unvani = null;
    this.adi = bosSozce;
    this.soyadi = bosSozce;
    this.kimligi = null;
    this.dogumTarihi = Sabit.BOSTARIH;
    this.cinsiyeti = Cinsiyet.VARSAYILAN;
    this.medeniDurumu = MedeniDurum.VARSAYILAN;     
    this.iletisimKumesi = new HashSet<KisiIletisim>(0);
    this.kisiDetay = null;
    
}   

// Constructors, getters and setters 

EDIT-1 Андреас указал, что определение enum отсутствует и не подходит для этого класса. Kisi использует два перечисления: Cinsiyet (пол) и MedeniDurum (семейное положение). Несмотря на то, что я изменил его, проблема все еще сохраняется.

public enum Cinsiyet {

VARSAYILAN,
KADIN,
ERKEK
 
}



public enum MedeniDurum   {

VARSAYILAN,
EVLI,
BEKAR,  
DUL,

 
}

Структура таблицы базы данных выглядит следующим образом:

Таблица базы данных Kisi entity: Таблица базы данных объекта Киси

Когда я пытаюсь вставить Kisi , я получаю сообщение об ошибке:

Error: 932, Position: 121, Sql = insert в значения KISIPROFIL.KISI (ADI, CINSIYET, dogumTarihi, MEDENIDURUMU, SOYADI, UNVANANAHTAR, ANAHTAR) (: 1,: 2,: 3,: 4,: 5,: 6,: 7), Ошибка Msg = ORA-00932: несовместимые типы данных: должно быть: НОМЕР получен: ДВОИЧНЫЙ

исходный sql:

вставить в KISIPROFIL.KISI (ADI, CINSIYET, dogumTarihi, MEDENIDURUMU, SOYADI, UNVANANAHTAR, ANAHTAR) values ​​(?,?,?,?,?,?,?)

sql:

вставить в KISIPROFIL.KISI (ADI, CINSIYET, dogumTarihi, MEDENIDURUMU, SOYADI, UNVANANAHTAR, ANAHTAR) значения (: 1,: 2,: 3,: 4,: 5,: 6,: 7)

OracleErrorNumber:

932

stacktrace

org.hibernate.exception.internal.StandardSQLExceptionConverter.convert (StandardSQLExceptionConverter. java: 42) org.hibernate.engine .jdb c .spi .SqlExceptionHelper.convert (SqlExceptionHelper. java: 109) org.hibernate.engine.jdb c .spi.SqlExceptionHelper.convert (SqlExceptionHelper. java: 95) org.hibernate.engine.jdbternal c .in .ResultSetReturnImpl.executeUpdate (ResultSetReturnImpl. java: 207) org.hibernate.engine.jdb c .batch.internal.NonBatchingBatch.addToBatch (NonBatchingBatch. java: 45) orbstract.Entiberity. insert (AbstractEntityPersister. java: 2886) org.hibernate.persister.entity.AbstractEntityPersister.insert (AbstractEntityPersister. java: 3386) org.hibernate.action.internal.EntityInsertAction.execute (EntityInsertAction. java: 8 1049 *

Как мне решить эту проблему?

Заранее спасибо.

Oracle Версия: Personal Oracle Database 11g Release 11.2.0.1.0 - 64bit Производство

Артикул:

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.7.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.6.Final</version>
    </dependency>

1 Ответ

0 голосов
/ 16 июля 2020

Проблема была инициирована с "частного LocalDate dogumTarihi;". LocalDate не может напрямую преобразовать в DATE. Как отметил Торбен Янссен, «JPA отобразит его в BLOB вместо DATE или TIMESTAMP. Это означает, что база данных не знает об объекте даты и не может применить для него какую-либо оптимизацию». https://thorben-janssen.com/persist-localdate-localdatetime-jpa/

Это не имеет ничего общего со значениями перечисления. Вы должны либо

1- преобразовать LocalDate в Date при отклонении класса. (dogumTarihi должно быть "приватное Date dogumTarihi;") 2- Вы должны написать конвертер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...