Hazırda bekletme modu org.hibernate.AnnotationException değerini atar: com..domain.idea.MAE_MFEView öğesi için tanımlayıcı belirtilmedi


207

Neden bu istisnayı alıyorum?

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

Güncelleme: Kodumu şu şekilde görünecek şekilde değiştirdim:

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

ama şimdi bu istisnayı alıyorum:

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

btw, soru ile ilgisiz, bu oldukça uzun bir yığın izidir. Tekrar eden çağrılarınız var. Orada her şeyin doğru olduğundan emin misin?
Bozho

yığın izlerinin neden bu kadar uzun olduğundan emin değilim. Etkilenen çok sayıda arka plan hizmeti olduğunu düşünüyorum.
Ramy

Kimliğiniz statik değilse veya sınıfınızdaki bazı özniteliklere dikkat edin. Benimle oldu :)
Gean Felipe

Yanıtlar:


433

Açıklamalı olarak eklenmiş bir alan eksik @Id. Her birinin bir @Entityihtiyacı vardır @Id- bu veritabanındaki birincil anahtardır.

Varlığınızın ayrı bir tabloda kalıcı olmasını istemiyorsanız, bunun yerine diğer varlıkların bir parçası olmasını istiyorsanız, @Embeddableyerine kullanabilirsiniz @Entity.

Bir veri aktarım nesnesinin hazırda bekletme modundaki bazı verileri saklamasını istiyorsanız, üzerinde hiçbir ek açıklama kullanmayın - basit bir pojo bırakın.

Güncelleme: SQL görünümleriyle ilgili olarak, Hazırda Bekletme belgeleri şunları yazar:

Hazırda Bekleme eşlemesi için bir görünüm ile temel tablo arasında fark yoktur. Bu veritabanı düzeyinde şeffaftır


2
@Id alanım olmalı? Benim görüşüme göre, kesinlikle bir kimliği yok.
Ramy

Ne demek "bakış". Hazırda Bekletme modunda "görünüm" yoktur. Sadece bir model var.
Bozho

1
görünüme biraz kimlik atayın. Onsuz gidemem. Her satır (nesne) benzersiz bir şekilde tanımlanmalıdır.
Bozho

@Id ekledikten sonra yeni bir istisna elde edildi
Ramy

3
Teşekkür ederim! Bu sinir bozucu bir NullPointerFromHellException düzeltildi!
malix

172

Benim javax.persistence.Idiçin yerine kullanılmalı org.springframework.data.annotation.Id. Bu sorunla karşılaşan herkes için doğru Idsınıfı alıp almadığınızı kontrol edebilirsiniz .



benzer bir sorunu vardı.
AngelThread

59

@Id için Javax.persistance.Id'den farklı bir kitaplık içe aktardığınızda bu hata ortaya çıkabilir ; Bu davaya da dikkat etmeniz gerekebilir

Benim durumumda

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;

kodu böyle değiştirdiğimde işe yaradı

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;

1
değerli tavsiye .. kullanımdan kaldırmak org.springframework.data.annotation.Id plz
Christian Meyer

13

Aşağıdaki kod NullPointerException çözümünü çözebilir.

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

Eğer eklerseniz @Id, o zaman beyan yönteminin yukarıdaki gibi gibi başlarına ilan edebilir.


becoz ur @Id değeri, boş gösterici istisnası olan herhangi bir yere atamadı ve güncelleme yapmadı ...
Shivendra Prakash Shukla

2

Sesleri çılgınca biliyorum ama böyle bir hata aldım çünkü kaldırmayı unuttum

private static final long serialVersionUID = 1L;

otomatik olarak Eclipse JPA aracı tarafından oluşturulan bir tabloya varlık dönüşüm yaptım.

Sorunu çözen yukarıdaki satırı kaldırmak


1

PK varlığı için @EmbeddableId kullanmak sorunumu çözdü.

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

   @EmbeddedId
   SampleEntityPK id;

 }

1

Bence bu model modeli yanlış ithalat aşağıdaki sorun.

    import org.springframework.data.annotation.Id;

Normalde şöyle olmalıdır:

    import javax.persistence.Id;

1

TL; DR

@IdEntity özelliğini kaçırıyorsunuz ve bu yüzden Hibernate bu istisnayı atıyor.

Varlık tanımlayıcıları

Herhangi bir JPA varlığı, Idek açıklama ile işaretlenmiş bir tanımlayıcı özelliğe sahip olmalıdır .

İki tür tanımlayıcı vardır:

  • atanmış
  • otomatik oluşturuldu

Atanan tanımlayıcılar

Atanmış bir tanımlayıcı aşağıdaki gibi görünür:

@Id
private Long id;

İlkel tip (ör . , ) Yerine bir sargı (ör. Long, Integer) Kullandığımıza dikkat edin . Bir sarıcı türünün kullanılması nedeniyle, eğer kontrol ederek Hibernate kullanarak daha iyi bir seçimdir olduğu ya da değil, hazırda daha iyi, bir ilişkili tablo satır vardır (bir varlık geçici olup olmadığını belirlemek (bir ilişkili tablo satırı yok) ya da müstakil olabilir ancak mevcut Sebat Bağlamı tarafından yönetilmez).longintidnull

Atanmış tanımlayıcı, arama devam etmeden önce uygulama tarafından manuel olarak ayarlanmalıdır:

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

entityManager.persist(post);

Otomatik oluşturulan tanımlayıcılar

Otomatik oluşturulan bir tanımlayıcı aşağıdakilerin @GeneratedValueyanında ek açıklama gerektirir @Id:

@Id
@GeneratedValue
private int id;

Bu makalede açıkladığım gibi , Hazırda Beklet'in varlık tanımlayıcısını otomatik olarak oluşturmak için kullanabileceği 3 strateji vardır:

  • IDENTITY
  • SEQUENCE
  • TABLE

IDENTITYStrateji temel veritabanı dizileri destekliyorsa kaçınılması gereken (örneğin, Oracle, PostgreSQL, 10,3 beri mariadb , 2012 yılından bu yana SQL Server). Dizileri desteklemeyen tek büyük veritabanı MySQL'dir.

Buradaki sorun IDENTITY, otomatik Hazırda Beklet toplu iş eklerinin bu strateji için devre dışı bırakılmış olmasıdır. Bu konu hakkında daha fazla bilgi için bu makaleye göz atın .

SEQUENCEMySQL kullanıyorsanız sürece strateji en iyi seçimdir. İçin SEQUENCEstrateji, ayrıca kullanmak istediğiniz pooledoptimize edici aynı Sebat Bağlamında birden varlıkları devam eden zaman veritabanı döngü sayısını azaltmak için.

TABLEJeneratör, çünkü korkunç bir seçimdir bu ölçeklendirme değil . Taşınabilirlik için, SEQUENCEvarsayılan olarak kullanmaktan daha iyidir ve bu makaledeIDENTITY açıklandığı gibi yalnızca MySQL'e geçebilirsiniz .


İlk örnek olmamalı @GeneratedValue, değil mi?
Josef Cech

0

Bu hata, yanlış Id sınıfının içe aktarılmasından kaynaklandı. Org.springframework.data.annotation.Id dosyasını javax.persistence olarak değiştirdikten sonra.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.