簡體   English   中英

Hibernate 中的 LocalDate 到日期轉換問題:ORA-00932:不一致的數據類型:應該是:收到的數字:BINARY

[英]LocalDate to Date Conversion Problem in Hibernate: ORA-00932: inconsistent data types: should be: NUMBER received: BINARY

我在 Hibernate 項目中遇到錯誤。有一個Kisi class。 這是我項目的 class 結構:

Kisi實體:

@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 Andreas 指出枚舉的定義在 class 中不存在且不合適。 Kisi 使用兩個枚舉,Cinsiyet(性別)和 MedeniDurum(婚姻狀況)。 即使我改變了它,問題仍然存在。

public enum Cinsiyet {

VARSAYILAN,
KADIN,
ERKEK
 
}



public enum MedeniDurum   {

VARSAYILAN,
EVLI,
BEKAR,  
DUL,

 
}

數據庫表結構如下:

Kisi實體的數據庫表: Kisi實體數據庫表

當我嘗試插入Kisi時,出現錯誤:

Error: 932, Position: 121, Sql =insert into KISIPROFIL.KISI (ADI, CINSIYET, dogumTarihi, MEDENIDURUMU, SOYADI, UNVANANAHTAR, ANAHTAR) values (:1, :2, :3, :4, :5, :6, :7 ),錯誤消息 = ORA-00932:不一致的數據類型:應該是:收到的數字:BINARY

原裝 sql:

插入 KISIPROFIL.KISI (ADI, CINSIYET, dogumTarihi, MEDENIDURUMU, SOYADI, UNVANANAHTAR, ANAHTAR) 值 (?, ?, ?, ?, ?, ?, ?)

sql:

插入 KISIPROFIL.KISI (ADI, CINSIYET, dogumTarihi, MEDENIDURUMU, SOYADI, UNVANANAHTAR, ANAHTAR) 值 (:1, :2, :3, :4, :5, :6, :7)

甲骨文錯誤編號:

932

堆棧跟蹤

org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)org.hibernate.engine.jdbc.spi.SqlExceptionHelper. convert(SqlExceptionHelper.java:95)org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.Z93F725A07423FE1C889F448 B33D21F46Z:2886)org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3386)org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:8

我該如何克服這個問題?

提前致謝。

Oracle 版本:個人 Oracle 數據庫 11g 發布 11.2.0.1.0 - 64 位生產

參考:

<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>

問題是從“private LocalDate dogumTarihi;”開始的。 LocalDate 不能直接轉換為 DATE。 As Thorben Janssen pointed out that "JPA will map it to a BLOB instead of a DATE or TIMESTAMP. That means the database is not aware of the date object and cannot apply any optimization for it. " https://thorben-janssen.com /persist-localdate-localdatetime-jpa/

它與枚舉值無關。 你應該要么

1-在 class decleration 中將 LocalDate 轉換為 Date。 (dogumTarihi 應為“私人日期 dogumTarihi;”) 2- 你應該寫一個轉換器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM