Исключение спящего режима: 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
Ответы
Ответ 1
Вам не хватает поля, аннотированного с помощью @Id
. Каждому @Entity
нужен @Id
- это первичный ключ в базе данных.
Если вы не хотите, чтобы ваша сущность сохранялась в отдельной таблице, а скорее являлась частью других объектов, вы можете использовать @Embeddable
вместо @Entity
.
Если вы хотите просто объект передачи данных для хранения некоторых данных из объекта спящего режима, не используйте никаких аннотаций на нем - оставьте это простым pojo.
Обновление. Что касается представлений SQL, документы Hibernate записывают:
Нет никакой разницы между представлением и базовой таблицей для сопоставления Hibernate. Это прозрачно на уровне базы данных
Ответ 2
Для меня вместо org.springframework.data.annotation.Id
следует использовать javax.persistence.Id
. Для всех, кто столкнулся с этой проблемой, вы можете проверить, был ли вы импортирован правильный класс Id
.
Ответ 3
Эта ошибка может возникать, когда вы импортируете библиотеку для @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;
Ответ 4
Код ниже может решить исключение 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
, вы можете объявить еще что-то вроде описанного выше метода.
Ответ 5
Я знаю, звучит безумно, но я получил такую ошибку, потому что я забыл удалить
private static final long serialVersionUID = 1L;
автоматически генерируется инструментом JPA Eclipse, когда я выполняю преобразование таблицы в сущности.
Удаление строки выше, что решило проблему