我为什么会收到此异常?
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文档写道:
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工具自动生成。
删除上面已解决问题的行
使用@EmbeddableId作为PK实体已解决了我的问题。
@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;
此错误是由于导入错误的ID类引起的。将org.springframework.data.annotation.Id更改为javax.persistence.Id之后,应用程序运行
您缺少@Id
实体属性,因此Hibernate抛出该异常。
任何JPA实体都必须具有一个标识属性,该属性用Id
批注标记。
有两种类型的标识符:
分配的标识符如下:
@Id
private Long id;
注意,我们使用包装器(例如
Long
,Integer
)而不是原始类型(例如long
,int
)。使用Hibernate时,使用包装器类型是一个更好的选择,因为通过检查id
是否为null
,Hibernate可以更好地确定实体是瞬态的(它没有关联的表行)还是分离的(实体)有一个关联的表行,但不受当前的持久性上下文管理。)
分配的标识符必须在调用持久化之前由应用程序手动设置:
Post post = new Post();
post.setId(1L);
entityManager.persist(post);
自动生成的标识符除@GeneratedValue
外还需要@Id
注释:
@Id
@GeneratedValue
private int id;
正如我在this article中所解释的,Hibernate可以使用三种策略来自动生成实体标识符:
IDENTITY
SEQUENCE
TABLE
如果基础数据库支持序列(例如,自2012年以来的Oracle,PostgreSQL,IDENTITY
,SQL Server),则应避免使用MariaDB since 10.3策略。不支持序列的唯一主要数据库是MySQL。
IDENTITY
的问题在于,此策略禁用了自动休眠批处理插入。有关此主题的更多详细信息,请签出this article。
SEQUENCE
策略是最佳选择,除非您使用MySQL。对于SEQUENCE
策略,在同一持久性上下文中持久存储多个实体时,您还想使用pooled
optimizer减少数据库往返次数。
pooled
生成器是一个糟糕的选择,因为TABLE
。对于可移植性,最好在默认情况下使用it does not scale并仅针对MySQL切换到SEQUENCE
,如IDENTITY
中所述。