【问题标题】:how to set a @entity without @id element?如何设置没有@id 元素的@entity?
【发布时间】:2015-08-23 03:18:22
【问题描述】:

我有这个豆子:

@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

如何设置这个 bean?我需要的是根据用户 ID 获取他有权访问的所有 ROL-AREA。

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

【问题讨论】:

标签: java hibernate


【解决方案1】:

您必须为每个 bean 设置一个身份,这是没有办法的。但是,如果您的所有字段都不是唯一的,您可以使用组合键。

如果您所有字段的组合是唯一的,请尝试使用@Id 注释所有字段。使用尽可能少的字段,但尽可能多地使用以使组合独一无二。

【讨论】:

  • 或所有相关字段。正如我推测的另一个答案,我希望主键应该是(idUserarea),在这种情况下,您可以将@Id 放在这两个字段上,但不要放在rol 上。有关详细信息,请参阅Hibernate manual
  • 是的,答案是把3个字段设置为@Id,因为它们是外键,谢谢!
  • 警告:它们是外键并不意味着所有三个都是主键的一部分。将主要视为实际标识此特定Acceso 的内容。可以有多行具有相同的(用户,区域)组合吗?我的直觉说 rol 不应该是你的主键的一部分,但也许我错了——如果你可以有多个 rols 用于用户+区域组合,那么 rol 是你 id 的一部分。跨度>
【解决方案2】:

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>();
}

【讨论】:

    【解决方案3】:

    您没有指定 id,因此您必须在 idUser 上添加 @Id 注释

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

    【讨论】:

    • 除此之外,根据他的 cmets,我怀疑他是否希望 idUser 成为该表的主键。听起来更像 idUser 是用户表的外键。
    • 是的,我知道,但它就是那个或 EmbeddedId(复合主键)
    • 听起来好像它需要是一个复合键;我认为 (idUser, area) 的组合可以解决问题。
    猜你喜欢
    • 2018-08-24
    • 2019-08-27
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多