Почему я получаю это исключение?
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
.Если вы хотите, чтобы просто объект передачи данных содержал некоторые данные из спящего объекта, не используйте никаких аннотаций к нему - оставьте это простым pojo.
Обновление: Что касается представлений SQL, документы Hibernate пишут:
источник
Для меня
javax.persistence.Id
следует использовать вместоorg.springframework.data.annotation.Id
. Для тех, кто сталкивался с этой проблемой, вы можете проверить, правильно ли вы импортировалиId
класс.источник
Эта ошибка может возникать, когда вы импортируете библиотеку для @Id, отличную от Javax.persistance.Id ; Возможно, вам придется обратить внимание на этот случай тоже
В моем случае я имел
когда я изменяю код, как это, он работал
источник
Код ниже может решить исключение NullPointerException.
Если вы добавите
@Id
, то вы можете объявить еще несколько, как описано выше метод.источник
Я знаю, звучит безумно, но я получил такую ошибку, потому что я забыл удалить
автоматически генерируется инструментом Eclipse JPA при преобразовании таблицы в сущности.
Удаление строки выше, что решило проблему
источник
Использование @EmbeddableId для объекта PK решило мою проблему.
источник
Я думаю, что эта проблема после модели класса неправильно импортировать.
Обычно это должно быть:
источник
TL; DR
Вам не хватает
@Id
свойства объекта, и именно поэтому Hibernate выдает это исключение.Идентификаторы сущностей
Любая сущность JPA должна иметь свойство идентификатора, помеченное
Id
аннотацией.Существует два типа идентификаторов:
Назначенные идентификаторы
Назначенный идентификатор выглядит следующим образом:
Присвоенный идентификатор должен быть установлен приложением вручную перед вызовом persist:
Автоматически сгенерированные идентификаторы
Автоматически сгенерированный идентификатор требует
@GeneratedValue
аннотации помимо@Id
:Как я объяснил в этой статье , есть три стратегии, которые Hibernate может использовать для автоматической генерации идентификатора сущности:
IDENTITY
SEQUENCE
TABLE
IDENTITY
Стратегии следует избегать , если основная база данных поддерживает последовательности (например, Oracle, PostgreSQL, MariaDB , так как 10.3 , SQL Server с 2012 года). Единственная основная база данных, которая не поддерживает последовательности, - это MySQL.SEQUENCE
Стратегия является лучшим выбором , если вы не используете MySQL. ДляSEQUENCE
стратегии вы также хотите использоватьpooled
оптимизатор, чтобы уменьшить количество циклических обращений к базе данных при сохранении нескольких объектов в одном и том же контексте постоянства.TABLE
Генератор ужасный выбор , потому что это не масштаб . Для мобильности лучше использоватьSEQUENCE
по умолчанию и переключаться толькоIDENTITY
на MySQL, как описано в этой статье .источник
@GeneratedValue
, верно?Эта ошибка была вызвана импортом неправильного класса Id. После изменения org.springframework.data.annotation.Id в javax.persistence. Идет запуск приложения.
источник