首页 > 解决方案 > Hibernate 中的 LocalDate 到日期转换问题:ORA-00932:不一致的数据类型:应该是:收到的 NUMBER:BINARY

问题描述

我在 Hibernate 项目中遇到错误。有一个Kisi类。这是我的项目的类结构:

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 指出枚举的定义在课堂上不存在且不合适。Kisi 使用两个枚举,Cinsiyet(性别)和 MedeniDurum(婚姻状况)。即使我改变了它,问题仍然存在。

public enum Cinsiyet {

VARSAYILAN,
KADIN,
ERKEK
 
}



public enum MedeniDurum   {

VARSAYILAN,
EVLI,
BEKAR,  
DUL,

 
}

数据库表结构如下:

Kisi实体 的数据库表:Kisi实体数据库表

当我尝试插入Kisi时,出现错误:

错误:932,位置:121,Sql =插入到 KISIPROFIL.KISI(ADI,CINSIYET,dogumTarihi,MEDENIDURUMU,SOYADI,UNVANANAHTAR,ANAHTAR)值(: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.java:2886)org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3386)org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.爪哇: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>

标签: javaoraclehibernate

解决方案


问题是从“private LocalDate dogumTarihi;”开始的。LocalDate 不能直接转换为 DATE。正如 Thorben Janssen 指出的那样,“JPA 会将其映射到 BLOB 而不是 DATE 或 TIMESTAMP。这意味着数据库不知道日期对象并且无法对其应用任何优化。” https://thorben-janssen.com /persist-localdate-localdatetime-jpa/

它与枚举值无关。你应该要么

1-在类声明中将 LocalDate 转换为 Date。(dogumTarihi 应为“私人日期 dogumTarihi;”) 2- 你应该写一个转换器。


推荐阅读