JPA错误:实体未定义主密钥属性



我在应用程序中使用JPA。在其中之一中,我没有使用过主要键(我知道它是一个不好的设计)。

现在,生成的实体如下所述:

@Entity
@Table(name="INTI_SCHEME_TOKEN")
public class IntiSchemeToken implements Serializable {
    private static final long serialVersionUID = 1L;
    @Column(name="CREATED_BY")
    private String createdBy;
    @Temporal( TemporalType.DATE)
    @Column(name="CREATED_ON")
    private Date createdOn;
    @Column(name="SCH_ID")
    private BigDecimal schId;
    @Column(name="TOKEN_ID")
    private BigDecimal tokenId;
    public IntiSchemeToken() {
    }
    public String getCreatedBy() {
        return this.createdBy;
    }
    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }
    public Date getCreatedOn() {
        return this.createdOn;
    }
    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }
    public BigDecimal getSchId() {
        return this.schId;
    }
    public void setSchId(BigDecimal schId) {
        this.schId = schId;
    }
    public BigDecimal getTokenId() {
        return this.tokenId;
    }
    public void setTokenId(BigDecimal tokenId) {
        this.tokenId = tokenId;
    }

} 

在我的项目中,Eclipse IDE在此类上显示了错误标记(红色交叉),错误是" 实体没有定义的主要密钥属性"。

谁能告诉我,如何在没有主键的情况下创建实体?

谢谢。

你不能。实体必须具有独特的,不变的ID。它不必定义为数据库中的主要键,但是字段或一组字段必须唯一标识该行,并且其值可能不会更改。

因此,如果您的实体中的一个字段或实体中的一组字段满足这些条件,请将其(或它们)成为实体的ID。例如,如果用户无法在同一天创建两个实例,则可以制作[创建,创建]实体的ID。

当然这是一个不好的解决方案,您应该真正更改模式,并在实体中添加自动化的单列ID。

如果您的主键(PK)是一个托管超级类,它是在实体类中继承的,那么您必须在persistence.xml文件中包含映射的超级类名称。

查看错误报告:https://bugs.eclipse.org/bugs/show_bug.cgi?id=361042

如果您需要在没有主键的情况下定义类,则应将该类标记为嵌入式类。否则,您应该为您定义的所有实体提供主键。

您可以关闭已添加的(更改)验证。

转到工作区首选项" Java persistence-> jpa->错误/警告"下一个'type'and Change'实体没有主键'来警告。

除了http://en.wikibooks.org/wiki/wiki/java/jpersistence/indesity_and_secore_sequencing#no_primary_key,您还可以使用oracle in oracle:

in ocy of ROWID
  • 没有良好PK的Oracle Legacy表:如何冬眠?

但要注意:

  • http://www.orafaq.com/wiki/rowid

实体框架不适用于各种数据(例如用于分析的统计数据,而不是用于查询)。

其他没有冬眠的解决方案

如果 - 您的桌子上没有PK - 可以是PK的列的逻辑组合(如果您可以使用某种rowID,则不必 - 但是有些列是可确定的,因此由于DB限制,您真的无法创建PK - 而且您无法修改表结构(将打破插入/选择语句,而没有明确列出的列中的列表)

然后您可以尝试以下技巧 - 使用虚拟列在数据库中创建视图,该虚拟列具有串联逻辑键列的值('a ='|| a ||'||'b ='||'c ='c ..)或rowid - 通过此视图创建您的JPA实体类 - 用@ID注释标记虚拟列

就是这样。更新/删除数据操作也是可能的(不是插入),但是如果"虚拟键"列不是ROWID(以避免在DB表中进行完整的扫描搜索)

,我不会使用它们。

P.S。相同的想法在链接的问题中部分描述。

您需要创建主键,如果找不到任何合格字段,则创建自动增量ID。

CREATE TABLE fin_home_loan (
  ID int NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (ID));

只需添加假ID字段即可。在Postgres中:

@Id
@Column(name="ctid")
String id;

在Oracle中:

@Id
@Column(name="ROWID")
String rowid;

最新更新