Hibernate不会在getter上获取@Id注释

时间:2017-08-02 14:44:24

标签: java hibernate jpa annotations

问题

在我目前的项目中,我得到了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;
  }

}

文档参考

Hibernate documentation州:

  

默认情况下,类层次结构的访问类型由@Id或@EmbeddedId注释的位置定义。如果这些注释位于某个字段上,则只考虑字段的持久性,并通过该字段访问该状态。如果注释是在getter上,那么只考虑getter的持久性,并通过getter / setter访问状态。这在实践中运作良好,是推荐的方法。

问题

我的班级有其他属性,我想要注释getter 。所以我还需要将@Id注释放在getter上。

之前在其他项目中运行良好,但是这次Hibernate似乎没有获取实体的标识符,当getter被注释时。

  • 我是否需要更改其他配置属性?

  • 或者在Hibernate版本之间发生了这种变化吗?

1 个答案:

答案 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注释任何字段。混合和匹配将阻止它正常工作。