[hibernate] 최대 절전 모드에서 org.hibernate.AnnotationException이 발생 함 : 엔티티에 지정된 식별자가 없습니다 : com..domain.idea.MAE_MFEView

이 예외가 발생하는 이유는 무엇입니까?

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

업데이트 : 코드를 다음과 같이 변경했습니다.

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

그러나 지금이 예외가 발생합니다.

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



답변

로 표시된 필드가 누락되었습니다 @Id. 각각 @Entity@Id-데이터베이스의 기본 키입니다.

엔터티를 별도의 테이블에 유지하지 않고 다른 엔터티의 일부로 유지하려는 경우 @Embeddable대신 대신 사용할 수 있습니다 @Entity.

단순히 데이터 전송 객체가 최대 절전 모드 엔터티의 일부 데이터를 보유하도록하려면 아무 주석도 사용하지 마십시오. 단순한 포조로 두십시오.

업데이트 : SQL 뷰와 관련하여 Hibernate 문서는 다음과 같이 작성합니다.

최대 절전 모드 매핑의 뷰와 기본 테이블에는 차이가 없습니다. 이것은 데이터베이스 수준에서 투명합니다.


답변

나를 javax.persistence.Id위해 대신 사용해야합니다 org.springframework.data.annotation.Id. 이 문제가 발생한 사람은 올바른 Id수업 을 가져 왔는지 확인할 수 있습니다 .


답변

이 오류는 @Id에 대해 Javax.persistance.Id 와 다른 라이브러리를 가져올 때 발생할 수 있습니다 . 이 경우에도주의를 기울여야 할 수도 있습니다.

내 경우에는

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;

이와 같은 코드를 변경하면 작동합니다.

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;


답변

아래 코드는 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;
}

을 추가 @Id하면 위에 선언 된 메소드와 같이 더 선언 할 수 있습니다.


답변

나는 미친 소리를 알고 있지만 제거하는 것을 잊어 버렸기 때문에 그러한 오류가 발생했습니다.

private static final long serialVersionUID = 1L;

내가 테이블을 엔터티로 변환하면 Eclipse JPA 도구가 자동으로 생성합니다.

문제를 해결 한 위의 줄을 제거


답변

PK 엔터티에 @EmbeddableId를 사용하면 문제가 해결되었습니다.

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

   @EmbeddedId
   SampleEntityPK id;

 }


답변

모델 클래스 잘못된 가져 오기에 따라이 문제가 있다고 생각합니다.

    import org.springframework.data.annotation.Id;

일반적으로 다음과 같아야합니다.

    import javax.persistence.Id;