Java Spring/JPA/persistence实体属性字段不能是final?
我有一个Java Spring/JPA/persistence实体属性字段不能是final?,java,spring,maven,jpa,orm,Java,Spring,Maven,Jpa,Orm,我有一个springmvc项目,使用JPA,在过去的一段时间里我一直在做这个项目,没有这个问题。但现在由于某种原因(可能是环境问题,因为自从我上次使用笔记本电脑以来,我已经换上了新的笔记本电脑),我遇到了这个奇怪的错误 该项目本质上是一个创建和执行调查的工具,调查只是一组问题。有多种类型的问题,如“自动完成问题”、“多项选择问题”、“整数问题”等,收集不同类型的数据。每个问题类型都由一个子类建模,该子类扩展了一个名为DdmQuestion的抽象类,该抽象类如下所示: @Entity @Table
springmvc
项目,使用JPA
,在过去的一段时间里我一直在做这个项目,没有这个问题。但现在由于某种原因(可能是环境问题,因为自从我上次使用笔记本电脑以来,我已经换上了新的笔记本电脑),我遇到了这个奇怪的错误
该项目本质上是一个创建和执行调查的工具,调查只是一组问题。有多种类型的问题,如“自动完成问题”、“多项选择问题”、“整数问题”等,收集不同类型的数据。每个问题类型都由一个子类建模,该子类扩展了一个名为DdmQuestion
的抽象类,该抽象类如下所示:
@Entity
@Table(name = "ddm_question")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "question_type")
@JsonIgnoreProperties({"dataType"})
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@question_type")
@JsonSubTypes(value = { @Type(DdmTextQuestion.class),@Type(DdmDateQuestion.class),@Type(DdmTimeQuestion.class),@Type(DdmNumberIntegerQuestion.class),@Type(DdmChoiceMultiQuestion.class),@Type(DdmAutoCompleteQuestion.class) })
public abstract class DdmQuestion {
@Id
@GeneratedValue
@Column(name = "question_id")
private int questionId;
@Column(name = "name")
private String name;
public int getQuestionId() {
return questionId;
}
public void setQuestionId(int questionId) {
this.questionId = questionId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonIgnore
public abstract String getDataType();
}
@Entity
@DiscriminatorValue("ddm_question_date")
public class DdmDateQuestion extends DdmQuestion {
final private String DATA_TYPE = "Long"; // this is the line with the error
@Override
public String getDataType() {
return DATA_TYPE;
}
}
注意getDataType()
方法
然后,对于每种问题类型,我都有一个子类来扩展它,它看起来像这样:
@Entity
@Table(name = "ddm_question")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "question_type")
@JsonIgnoreProperties({"dataType"})
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@question_type")
@JsonSubTypes(value = { @Type(DdmTextQuestion.class),@Type(DdmDateQuestion.class),@Type(DdmTimeQuestion.class),@Type(DdmNumberIntegerQuestion.class),@Type(DdmChoiceMultiQuestion.class),@Type(DdmAutoCompleteQuestion.class) })
public abstract class DdmQuestion {
@Id
@GeneratedValue
@Column(name = "question_id")
private int questionId;
@Column(name = "name")
private String name;
public int getQuestionId() {
return questionId;
}
public void setQuestionId(int questionId) {
this.questionId = questionId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonIgnore
public abstract String getDataType();
}
@Entity
@DiscriminatorValue("ddm_question_date")
public class DdmDateQuestion extends DdmQuestion {
final private String DATA_TYPE = "Long"; // this is the line with the error
@Override
public String getDataType() {
return DATA_TYPE;
}
}
现在,我以前从未遇到过这个错误(我记得),但是Eclipse
在这里抛出了一个错误,它说:
属性“DATA_TYPE”的Java字段是final。就这些
说
如果我从类中删除@Entity
注释,这个错误就会消失,因此JPA
中的某些东西显然不喜欢这个,但我以前从未遇到过这个错误,所以我想在新版本中会有一些变化。我的POM对于依赖版本不是特别明确,所以这并不令人惊讶
有人能向我解释为什么会发生这种情况以及正确的解决方案是什么吗?我可以从字段声明中删除“final”,但这对我来说似乎是错误的,因为它肯定是一个终值
提前感谢。如果该字段不应在数据库中持久化,则通常应利用临时注释,该注释将告诉持久化提供程序在处理该字段时对其进行ommit处理:
@Transient
final private String DATA_TYPE = "Long";
如果Eclipse足够聪明,它应该停止突出显示错误
实体类必须遵循以下要求:
- 该类必须使用javax.persistence.Entity注释进行注释
- 该类必须具有公共或受保护的无参数构造函数。该类可能有其他构造函数
- 该类不能声明为最终类。任何方法或持久实例变量都不能声明为final
- 如果实体实例作为分离对象按值传递,例如通过会话bean的远程业务接口,则该类必须实现可序列化接口
- 实体可以扩展实体类和非实体类,非实体类可以扩展实体类
- 持久实例变量必须声明为private、protected或package private,并且只能由实体类的方法直接访问。客户端必须通过访问器或业务方法访问实体的状态
这对我来说似乎是一个常量值,为什么不将static关键字也添加到其中呢?JPA规范说得很清楚,JPA不能持久化final/staticfields@galovics隐马尔可夫模型。。。好问题,我刚试过,错误就消失了!但我不明白为什么…?@NeilStockton但这个代码在过去一直有效?!定义“工作”。根据定义,你改变了什么