Dlaczego otrzymuję ten wyjątek?
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;
}
}
Aktualizacja: Zmieniłem kod, aby wyglądał następująco:
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;
}
}
ale teraz otrzymuję ten wyjątek:
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
Odpowiedzi:
Brakuje pola z adnotacją
@Id
. Każdy@Entity
potrzebuje@Id
- jest to klucz podstawowy w bazie danych.Jeśli nie chcesz, aby twoja jednostka była utrwalona w osobnej tabeli, ale raczej była częścią innych jednostek, możesz użyć
@Embeddable
zamiast niej@Entity
.Jeśli chcesz, aby po prostu obiekt do przesyłania danych przechowywał niektóre dane z hibernacji, nie używaj do niego adnotacji - zostaw to proste pojęcie.
Aktualizacja: W odniesieniu do widoków SQL dokumenty Hibernacja piszą:
źródło
Dla mnie
javax.persistence.Id
należy użyć zamiastorg.springframework.data.annotation.Id
. Dla każdego, kto napotkał ten problem, możesz sprawdzić, czy zaimportowałeś odpowiedniąId
klasę.źródło
Ten błąd może zostać zgłoszony podczas importowania innej biblioteki dla @Id niż Javax.persistance.Id ; Być może trzeba będzie zwrócić uwagę również na tę sprawę
W moim przypadku miałem
kiedy zmieniam kod w ten sposób, działa
źródło
Poniższy kod może rozwiązać wyjątek NullPointerException.
Jeśli dodasz
@Id
, możesz zadeklarować trochę więcej jak wyżej zadeklarowana metoda.źródło
Wiem, że to szalone, ale otrzymałem taki błąd, ponieważ zapomniałem usunąć
automatycznie generowane przez narzędzie JPA Eclipse, gdy dokonałem transformacji tabeli do encji.
Usunięcie powyższej linii rozwiązało problem
źródło
Użycie @EmbeddableId dla jednostki PK rozwiązało mój problem.
źródło
Myślę, że ten problem wynika z nieprawidłowego importu klasy modelu.
Zwykle powinno to być:
źródło
TL; DR
Brakuje
@Id
właściwości bytu i dlatego Hibernacja zgłasza ten wyjątek.Identyfikatory jednostki
Każda jednostka JPA musi mieć właściwość identyfikatora oznaczoną
Id
adnotacją.Istnieją dwa rodzaje identyfikatorów:
Przypisane identyfikatory
Przypisany identyfikator wygląda następująco:
Przypisany identyfikator musi być ustawiony ręcznie przez aplikację przed wywołaniem trwałego:
Automatycznie wygenerowane identyfikatory
Automatycznie wygenerowany identyfikator wymaga
@GeneratedValue
adnotacji oprócz@Id
:Jak wyjaśniłem w tym artykule , istnieją 3 strategie, których Hibernacja może użyć do automatycznego wygenerowania identyfikatora jednostki:
IDENTITY
SEQUENCE
TABLE
IDENTITY
Strategia należy unikać, jeśli podstawowa baza danych obsługuje sekwencje (np, Oracle, PostgreSQL, MariaDB od 10.3 , SQL Server od 2012 roku). Jedyną dużą bazą danych, która nie obsługuje sekwencji, jest MySQL.SEQUENCE
Strategia jest najlepszym wyborem, chyba że używasz MySQL. W przypadkuSEQUENCE
strategii chcesz również użyćpooled
optymalizatora, aby zmniejszyć liczbę objazdów bazy danych podczas utrwalania wielu jednostek w tym samym kontekście trwałości.TABLE
Generator jest straszny wybór, ponieważ to nie skaluje . Jeśli chodzi o przenośność, lepiej jest używaćSEQUENCE
domyślnie i przejśćIDENTITY
na MySQL, jak wyjaśniono w tym artykule .źródło
@GeneratedValue
, prawda?Ten błąd został spowodowany przez zaimportowanie niewłaściwej klasy Id. Po zmianie org.springframework.data.annotation.Id na javax.persistence.Id aplikacja zostanie uruchomiona
źródło