Mengapa saya menerima pengecualian ini?
package com.domain.idea;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.AccessType;
/**
* object model for the view [InvestmentReturn].[vMAE_MFE]
*/
@Entity
@Table(name="vMAE_MFE", schema="InvestmentReturn")
@AccessType("field")
public class MAE_MFEView
{
/**
* trade property is a SuggestdTradeRecommendation object
*/
@OneToOne(fetch = FetchType.LAZY , cascade = { CascadeType.PERSIST })
@JoinColumn(name = "suggestedTradeRecommendationID")
private SuggestedTradeRecommendation trade;
/**
* Most Adeverse Excursion value
*/
private int MAE;
public int getMAE()
{
return MAE;
}
/**
* Most Favorable Excursion value
*/
private int MFE;
public int getMFE()
{
return MFE;
}
/**
* @return trade property
* see #trade
*/
public SuggestedTradeRecommendation getTrade()
{
return trade;
}
}
Pembaruan: Saya telah mengubah kode saya menjadi seperti ini:
package com.domain.idea;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.AccessType;
/**
* object model for the view [InvestmentReturn].[vMAE_MFE]
*/
@Entity
@Table(name="vMAE_MFE", schema="InvestmentReturn")
@AccessType("field")
public class MAE_MFEView
{
/**
* trade property is a SuggestdTradeRecommendation object
*/
@Id
@OneToOne(fetch = FetchType.LAZY , cascade = { CascadeType.PERSIST })
@JoinColumn(name = "suggestedTradeRecommendationID")
private SuggestedTradeRecommendation trade;
/**
* Most Adeverse Excursion value
*/
private int MAE;
public int getMAE()
{
return MAE;
}
/**
* Most Favorable Excursion value
*/
private int MFE;
public int getMFE()
{
return MFE;
}
/**
* @return trade property
* see #trade
*/
public SuggestedTradeRecommendation getTrade()
{
return trade;
}
}
tapi sekarang saya mendapatkan pengecualian ini:
Caused by: org.hibernate.MappingException: Could not determine type for: com.domain.idea.SuggestedTradeRecommendation, at table: vMAE_MFE, for columns: [org.hibernate.mapping.Column(trade)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:292)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:276)
at org.hibernate.mapping.RootClass.validate(RootClass.java:216)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1135)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
... 145 more
Jawaban:
Anda kehilangan bidang yang dianotasi dengan
@Id
. Setiap@Entity
kebutuhan dan@Id
- ini adalah kunci utama dalam database.Jika Anda tidak ingin entitas Anda bertahan dalam tabel terpisah, melainkan menjadi bagian dari entitas lain, Anda bisa menggunakan
@Embeddable
alih-alih@Entity
.Jika Anda hanya menginginkan objek transfer data untuk menyimpan beberapa data dari entitas hibernate, jangan gunakan anotasi apa pun - biarkan itu menjadi pojo sederhana.
Pembaruan: Sehubungan dengan tampilan SQL, dokumen Hibernate menulis:
sumber
Bagi saya,
javax.persistence.Id
sebaiknya digunakan sajaorg.springframework.data.annotation.Id
. Bagi siapa saja yang mengalami masalah ini, Anda dapat memeriksa apakah Anda mengimporId
kelas yang tepat .sumber
Kesalahan ini dapat terjadi ketika Anda mengimpor pustaka yang berbeda untuk @Id dari Javax.persistance.Id ; Anda mungkin perlu memperhatikan hal ini juga
Dalam kasus saya, saya punya
ketika saya mengubah kode seperti ini, itu berhasil
sumber
Kode di bawah ini dapat menyelesaikan NullPointerException.
Jika Anda menambahkan
@Id
, maka Anda dapat mendeklarasikan lebih seperti metode yang dinyatakan di atas.sumber
Saya tahu kedengarannya gila tapi saya menerima kesalahan seperti itu karena saya lupa menghapus
secara otomatis dihasilkan oleh alat Eclipse JPA ketika tabel untuk transformasi entitas telah saya lakukan.
Menghapus baris di atas yang menyelesaikan masalah
sumber
Menggunakan @EmbeddableId untuk entitas PK telah menyelesaikan masalah saya.
sumber
Saya pikir masalah ini mengikuti model kelas impor yang salah.
Biasanya, seharusnya:
sumber
TL; DR
Anda kehilangan
@Id
properti entitas, dan itulah sebabnya Hibernate melempar pengecualian itu.Pengidentifikasi entitas
Entitas JPA mana pun harus memiliki properti pengenal, yang ditandai dengan
Id
anotasi.Ada dua jenis pengidentifikasi:
Pengidentifikasi yang ditugaskan
Identifier yang ditugaskan terlihat sebagai berikut:
Pengidentifikasi yang ditetapkan harus ditetapkan secara manual oleh aplikasi sebelum panggilan tetap:
Pengidentifikasi yang dibuat secara otomatis
Identifier yang dibuat secara otomatis membutuhkan
@GeneratedValue
anotasi selain@Id
:Seperti yang saya jelaskan dalam artikel ini , ada 3 strategi yang dapat digunakan Hibernate untuk menghasilkan pengenal entitas secara otomatis:
IDENTITY
SEQUENCE
TABLE
The
IDENTITY
Strategi harus dihindari jika database yang mendasari mendukung urutan (misalnya, Oracle, PostgreSQL, MariaDB sejak 10.3 , SQL Server sejak 2012). Satu-satunya basis data utama yang tidak mendukung urutan adalah MySQL.The
SEQUENCE
strategi adalah pilihan terbaik kecuali jika Anda menggunakan MySQL. UntukSEQUENCE
strategi, Anda juga ingin menggunakanpooled
pengoptimal untuk mengurangi jumlah pulang-pergi basis data ketika bertahan beberapa entitas dalam Konteks Persistensi yang sama.The
TABLE
Generator adalah pilihan yang mengerikan karena tidak skala . Untuk portabilitas, Anda lebih baik menggunakanSEQUENCE
secara default dan beralih keIDENTITY
hanya untuk MySQL, seperti yang dijelaskan dalam artikel ini .sumber
@GeneratedValue
, kan?Kesalahan ini disebabkan oleh mengimpor kelas Id yang salah. Setelah mengubah org.springframework.data.annotation.Id ke javax.persistence.Id aplikasi berjalan
sumber