如何在没有@id元素的情况下设置@entity?

时间:2015-06-08 15:10:42

标签: java hibernate

我有这个豆子:

@Entity
@Table(name = "accesos")
public class Acceso implements Serializable {
    /** */
    @Column(name = "idUser")
    private String idUser;
    /** */
    @ManyToOne
    @JoinColumn(name = "idArea")
    private Area area;
    /** */
    @ManyToOne
    @JoinColumn(name = "idRol")
    private Rol rol;

但是我收到了这个错误:

  

引起:org.hibernate.AnnotationException:没有为entity指定标识符:com ... Acceso

如何设置此bean?我需要的是基于用户ID获取他有权访问的所有ROL-AREA。

我尝试将@Entity更改为@Embedded,但是当我进行搜索时,不会返回任何结果,即使在日志中也没有执行SQL语句。

3 个答案:

答案 0 :(得分:4)

你必须拥有每个bean的身份,没有办法解决。但是,如果您的任何字段都不是唯一的,则可以使用组合键。

如果所有字段的组合都是唯一的,请尝试使用@Id注释所有字段。尽可能少的字段,但需要尽可能多的字段使组合独特。

答案 1 :(得分:1)

JPA规范规定所有实体必须具有标识符(JSR 317, section 2.4)。它可以是单列或复合键。

您可以在idAcceso实体中添加Acceso标识符,也可以不将Acceso设为实体,而是设置"组件" (这是@Embeddable注释的目的)。组件不需要ID,但无法单独查询(即您无法执行select a from Acceso a,而是需要查询User,然后使用访问方法user.getAccesos()

在此上下文中,您无法将@Entity替换为@Embedded

@Embeddable
public class Acceso {
  // ...
}

@Entity
public class User {
  @Id protected String id;
  // ...

  @ElementCollection
  @CollectionTable(
    name="USER_ACCESSES",
    joinColumns=@JoinColumn(name="USER_ID")
  protected Set<Acceso> accesos = new HashSet<Acceso>();
}

答案 2 :(得分:-1)

您没有指定ID,您必须将@Id注释添加到idUser

@Id
@Column(name = "idUser")
private String idUser;