我有这个豆子:
@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语句。
答案 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;