Java 如何设置没有@id元素的@entity?
我有这个豆子:Java 如何设置没有@id元素的@entity?,java,hibernate,Java,Hibernate,我有这个豆子: @Entity @Table(name = "accesos") public class Acceso implements Serializable { /** */ @Column(name = "idUser") private String idUser; /** */ @ManyToOne @JoinColumn(name = "idArea") private Area area; /** */
@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:未为实体指定标识符:com…Acceso
这个豆子怎么调?我需要的是根据用户ID获取他可以访问的所有ROL-AREA
我尝试将
@Entity
更改为@Embedded
,但当我进行搜索时,没有返回任何结果,甚至在日志中也没有执行SQL语句。您没有指定id,因此必须将@id注释添加到idUser上
@Id
@Column(name = "idUser")
private String idUser;
每个bean都必须有一个标识,没有办法。但是,如果字段都不是唯一的,则可以使用组合键
如果所有字段的组合都是唯一的,请尝试使用
@Id
注释所有字段。获取尽可能少的字段,但尽可能多的字段以使组合唯一。JPA规范规定所有实体都必须有一个标识符()。它可以是单列或复合键
您可以将idAcceso
标识符放入Acceso
实体中,也可以不将Acceso
作为实体,而是作为“组件”(这是@embeddeble
注释的目的)。组件不需要ID,但不能单独查询(即,您不能执行从Acceso a
中选择a,而是需要查询用户
,然后使用访问器方法User.getAccesos()
)
在此上下文中,不能将@实体
替换为@嵌入式
@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>();
}
@可嵌入
公共类科目{
// ...
}
@实体
公共类用户{
@Id受保护的字符串Id;
// ...
@元素集合
@收集表(
name=“用户访问”,
joinColumns=@JoinColumn(name=“USER\u ID”)
受保护的集合accesos=新的HashSet();
}
实体必须始终具有主键;您不能创建没有主键(id)的实体。可能存在重复,但根据他的评论,我怀疑他是否希望idUser成为此表的主键。听起来idUser更像是用户表中的外键。是的,我知道,但它是一个嵌入id(复合主键)听起来它需要一个复合键;我认为(idUser,area)的组合就可以了。或者所有相关的字段。正如我在另一个答案上推测的那样,我希望主键应该是(idUser
,area
)在这种情况下,您可以将@Id
放在这两个字段上,而不是放在rol
上。有关详细信息,请参阅。是的,答案是将这三个字段设置为@Id,因为它们是外键,谢谢!警告:它们是外键并不自动意味着这三个字段都是主键的一部分。请将主键视为实际上,是什么识别了这个特殊的Acceso
。同一(用户,区域)组合可以有多行吗?我的直觉说rol
不应该是你主键的一部分,但也许我错了——如果你可以有多个rol
用于用户+区域组合,那么rol
就是你id的一部分。