Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设置没有@id元素的@entity?_Java_Hibernate - Fatal编程技术网

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的一部分。