Hibernate melempar org.hibernate.AnnotationException: Tidak ada pengidentifikasi yang ditentukan untuk entitas: com..domain.idea.MAE_MFEView

207

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
Ramy
sumber
btw, tidak ada hubungannya dengan pertanyaan, itu stacktrace yang agak panjang. Anda memiliki beberapa permintaan yang berulang. Apakah Anda yakin semuanya benar di sana.
Bozho
tidak terlalu yakin mengapa tumpukan-jejak selalu begitu lama. Saya pikir ada banyak layanan latar belakang berjalan yang terpengaruh.
Ramy
Perhatikan jika id Anda tidak statis atau atribut di kelas Anda. Itu terjadi pada saya :)
Gean Felipe

Jawaban:

434

Anda kehilangan bidang yang dianotasi dengan @Id. Setiap @Entitykebutuhan 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 @Embeddablealih-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:

Tidak ada perbedaan antara tampilan dan tabel dasar untuk pemetaan Hibernate. Ini transparan di tingkat basis data

Bozho
sumber
2
Saya harus memiliki bidang @Id? Pandangan saya tidak memiliki ID.
Ramy
Apa maksudmu "lihat". Tidak ada "tampilan" di Hibernate. Hanya ada model.
Bozho
1
baik, tetapkan beberapa id untuk tampilan. Tidak bisa pergi tanpanya. Setiap baris (objek) harus diidentifikasi secara unik.
Bozho
mendapatkan pengecualian baru setelah menambahkan @Id
Ramy
3
Terima kasih! Ini memperbaiki NullPointerFromHellException yang menjengkelkan!
malix
172

Bagi saya, javax.persistence.Idsebaiknya digunakan saja org.springframework.data.annotation.Id. Bagi siapa saja yang mengalami masalah ini, Anda dapat memeriksa apakah Anda mengimpor Idkelas yang tepat .

Searene
sumber
2
Anda menyelamatkan hari saya: ')
Amitrajit Bose
punya masalah serupa.
AngelThread
59

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

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

import org.springframework.data.annotation.Id;

@Entity
public class Status {

    @Id
    @GeneratedValue
    private int id;

ketika saya mengubah kode seperti ini, itu berhasil

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

import javax.persistence.Id;

@Entity
public class Status {

    @Id
    @GeneratedValue
    private int id;
Tadele Ayelegn
sumber
1
nasihat yang berharga .. hentikan org.springframework.data.annotation.Id plz
Christian Meyer
13

Kode di bawah ini dapat menyelesaikan NullPointerException.

@Id
@GeneratedValue
@Column(name = "STOCK_ID", unique = true, nullable = false)
public Integer getStockId() {
    return this.stockId;
}
public void setStockId(Integer stockId) {
    this.stockId = stockId;
}

Jika Anda menambahkan @Id, maka Anda dapat mendeklarasikan lebih seperti metode yang dinyatakan di atas.

Shivendra Prakash Shukla
sumber
karena nilai @Id saya tidak menetapkan & memperbarui di mana saja yang Anda dapatkan pengecualian pointer nol ...
Shivendra Prakash Shukla
2

Saya tahu kedengarannya gila tapi saya menerima kesalahan seperti itu karena saya lupa menghapus

private static final long serialVersionUID = 1L;

secara otomatis dihasilkan oleh alat Eclipse JPA ketika tabel untuk transformasi entitas telah saya lakukan.

Menghapus baris di atas yang menyelesaikan masalah

ittradco
sumber
1

Menggunakan @EmbeddableId untuk entitas PK telah menyelesaikan masalah saya.

@Entity
@Table(name="SAMPLE")
 public class SampleEntity implements Serializable{
   private static final long serialVersionUID = 1L;

   @EmbeddedId
   SampleEntityPK id;

 }
Venkatesh Ramoju
sumber
1

Saya pikir masalah ini mengikuti model kelas impor yang salah.

    import org.springframework.data.annotation.Id;

Biasanya, seharusnya:

    import javax.persistence.Id;
Mahendra Sri
sumber
1

TL; DR

Anda kehilangan @Idproperti entitas, dan itulah sebabnya Hibernate melempar pengecualian itu.

Pengidentifikasi entitas

Entitas JPA mana pun harus memiliki properti pengenal, yang ditandai dengan Idanotasi.

Ada dua jenis pengidentifikasi:

  • ditugaskan
  • dihasilkan secara otomatis

Pengidentifikasi yang ditugaskan

Identifier yang ditugaskan terlihat sebagai berikut:

@Id
private Long id;

Perhatikan bahwa kami menggunakan pembungkus (misalnya Long,, Integer) alih-alih jenis primitif (misalnya long,, int). Menggunakan tipe pembungkus adalah pilihan yang lebih baik ketika menggunakan Hibernate karena, dengan memeriksa apakah idada nullatau tidak, Hibernate dapat lebih baik menentukan apakah suatu entitas bersifat sementara (tidak memiliki baris tabel terkait) atau terlepas (memiliki baris tabel terkait, tapi itu tidak dikelola oleh Konteks Kegigihan saat ini).

Pengidentifikasi yang ditetapkan harus ditetapkan secara manual oleh aplikasi sebelum panggilan tetap:

Post post = new Post();
post.setId(1L);

entityManager.persist(post);

Pengidentifikasi yang dibuat secara otomatis

Identifier yang dibuat secara otomatis membutuhkan @GeneratedValueanotasi selain @Id:

@Id
@GeneratedValue
private int 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 IDENTITYStrategi 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.

Masalahnya IDENTITYadalah bahwa sisipan Hibernate batch otomatis dinonaktifkan untuk strategi ini. Untuk detail lebih lanjut tentang topik ini, lihat artikel ini .

The SEQUENCEstrategi adalah pilihan terbaik kecuali jika Anda menggunakan MySQL. Untuk SEQUENCEstrategi, Anda juga ingin menggunakan pooledpengoptimal untuk mengurangi jumlah pulang-pergi basis data ketika bertahan beberapa entitas dalam Konteks Persistensi yang sama.

The TABLEGenerator adalah pilihan yang mengerikan karena tidak skala . Untuk portabilitas, Anda lebih baik menggunakan SEQUENCEsecara default dan beralih ke IDENTITYhanya untuk MySQL, seperti yang dijelaskan dalam artikel ini .

Vlad Mihalcea
sumber
Contoh pertama tidak seharusnya @GeneratedValue, kan?
Josef Cech
0

Kesalahan ini disebabkan oleh mengimpor kelas Id yang salah. Setelah mengubah org.springframework.data.annotation.Id ke javax.persistence.Id aplikasi berjalan

Philip Afemikhe
sumber