Why am I getting this exception?
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;
}
}
Update: I've changed my code to look like this:
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;
}
}
but now I'm getting this exception:
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
This question is related to
hibernate
jpa
orm
identifier
hibernate-annotations
Using @EmbeddableId for the PK entity has solved my issue.
@Entity
@Table(name="SAMPLE")
public class SampleEntity implements Serializable{
private static final long serialVersionUID = 1L;
@EmbeddedId
SampleEntityPK id;
}
I know sounds crazy but I received such error because I forget to remove
private static final long serialVersionUID = 1L;
automatically generated by Eclipse JPA tool when a table to entities transformation I've done.
Removing the line above that solved the issue
This error can be thrown when you import a different library for @Id than Javax.persistance.Id ; You might need to pay attention this case too
In my case I had
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;
when I change the code like this, it got worked
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;
I think this issue following model class wrong import.
import org.springframework.data.annotation.Id;
Normally, it should be:
import javax.persistence.Id;
You are missing the @Id
entity property, and that's why Hibernate is throwing that exception.
Any JPA entity must have an identifier property, that is marked with the Id
annotation.
There are two types of identifiers:
An assigned identifier looks as follows:
@Id
private Long id;
Notice that we are using a wrapper (e.g.,
Long
,Integer
) instead of a primitive type (e.g.,long
,int
). Using a wrapper type is a better choice when using Hibernate because, by checking if theid
isnull
or not, Hibernate can better determine if an entity is transient (it does not have an associated table row) or detached (it has an associated table row, but it's not managed by the current Persistence Context).
The assigned identifier must be set manually by the application prior to calling persist:
Post post = new Post();
post.setId(1L);
entityManager.persist(post);
An auto-generated identifier requires the @GeneratedValue
annotation besides the @Id
:
@Id
@GeneratedValue
private int id;
There are 3 strategies Hibernate can use to auto-generate the entity identifier:
IDENTITY
SEQUENCE
TABLE
The IDENTITY
strategy is to be avoided if the underlying database supports sequences (e.g., Oracle, PostgreSQL, MariaDB since 10.3, SQL Server since 2012). The only major database that does not support sequences is MySQL.
The problem with
IDENTITY
is that automatic Hibernate batch inserts are disabled for this strategy.
The SEQUENCE
strategy is the best choice unless you are using MySQL. For the SEQUENCE
strategy, you also want to use the pooled
optimizer to reduce the number of database roundtrips when persisting multiple entities in the same Persistence Context.
The TABLE
generator is a terrible choice because it does not scale. For portability, you are better off using SEQUENCE
by default and switch to IDENTITY
for MySQL only.
import javax.persistence.Id;
For me, javax.persistence.Id
should be used instead of org.springframework.data.annotation.Id
. For anyone who encountered this issue, you can check if you imported the right Id
class.
The code below can solve the 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;
}
If you add @Id
, then you can declare some more like as above declared method.
This error was caused by importing the wrong Id class. After changing org.springframework.data.annotation.Id to javax.persistence.Id the application run
Source: Stackoverflow.com