java - 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时,出现错误:
错误: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>
解决方案
问题是从“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- 你应该写一个转换器。
推荐阅读
- javascript - 在 React 中注册不同组件的点击
- csv - 如何使用 akka 流 alpakka 编写带有标题的 CSV 文件?
- c# - Azure DevOps 中的 FileTransform 任务在转换时引发错误
- r - 如何根据R中的行名计算每列中的值总和?
- angular - Angular 将 2 个承诺与 1 个承诺相结合
- javascript - 等待从 React.Context 解决 promise,然后渲染按钮
- bazel - 重用下载包的不同部分(目录输出)?
- javascript - Codacy“在索引 0 处找到带有非文字参数的 fs.functionName”错误
- html - margin-top 因内容而异
- javascript - 日期过滤器错误地格式化日期值