在我目前的项目中,我得到了AnnotationException
:
org.hibernate.AnnotationException:没有为实体指定标识符:my.package.EntityClass
问题是由@Id
注释引起的,我将其从字段移到了getter:
@Entity
@Table(name = "MY_TABLE")
public class EntityClass extends BaseEntityClass {
private long id;
@Override
public void setId(long id) {
this.id = id;
}
@Override
@Id
@SequenceGenerator(name = "FOOBAR_GENERATOR", sequenceName = "SEQ_MY_TABLE", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "FOOBAR_GENERATOR")
public long getId() {
return this.id;
}
}
当我注释id
属性时,它可以正常工作:
@Entity
@Table(name = "MY_TABLE")
public class EntityClass extends BaseEntityClass {
@Id
@SequenceGenerator(name = "FOOBAR_GENERATOR", sequenceName = "SEQ_MY_TABLE", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "FOOBAR_GENERATOR")
private long id;
@Override
public void setId(long id) {
this.id = id;
}
@Override
public long getId() {
return this.id;
}
}
默认情况下,类层次结构的访问类型由@Id或@EmbeddedId注释的位置定义。如果这些注释位于某个字段上,则只考虑字段的持久性,并通过该字段访问该状态。如果注释是在getter上,那么只考虑getter的持久性,并通过getter / setter访问状态。这在实践中运作良好,是推荐的方法。
我的班级有其他属性,我想要注释getter 。所以我还需要将@Id
注释放在getter上。
之前在其他项目中运行良好,但是这次Hibernate似乎没有获取实体的标识符,当getter被注释时。
我是否需要更改其他配置属性?
或者在Hibernate版本之间发生了这种变化吗?
答案 0 :(得分:1)
您需要始终在所有getter上使用@Id
。确保没有使用<Virtualhost *:443>
ServerName www.somasimple.com
DocumentRoot /path/to/docroot
SSLEngine on
#.... (other SSL directives)
# Redirect / to /forums/home
RedirectMatch ^/$ /forums/home
</Virtualhost>
而不是getter注释任何字段。混合和匹配将阻止它正常工作。