JPA错误:实体没有定义主键属性

时间:2012-11-02 07:20:50

标签: jpa entity

我在我的应用程序中使用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在此类上显示ERROR标记(红色交叉),错误为“实体没有定义主键属性”。

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

感谢。

6 个答案:

答案 0 :(得分:20)

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

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

当然这是一个糟糕的解决方案,您应该真正更改架构并在实体中添加自动生成的单列ID。

答案 1 :(得分:6)

如果需要定义没有主键的类,则应将该类标记为Embeddable类。否则,您应该为您定义的所有实体提供主键。

答案 2 :(得分:3)

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

转到工作区首选项'Java Persistence-> JPA->错误/警告'下一个'类型'并将'实体没有主键'更改为'警告'。

答案 3 :(得分:1)

http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#No_Primary_Key外,您还可以在Oracle中使用ROWID之类的内置列:

但要小心:

实体框架不适用于所有类型的数据(例如用于分析而非查询的统计数据)。

答案 4 :(得分:0)

没有Hibernate的另一种解决方案

如果 - 你桌上没有PK - 列的逻辑组合可以是PK(如果你可以使用某种rowid,则不需要) - 但是有些列是NULLable,所以你真的因为DB限制而无法创建PK - 并且您无法修改表结构(会破坏插入/选择语句,而遗留代码中没有明确列出的列)

然后你可以尝试以下技巧 - 使用具有连接逻辑键列值的虚拟列在数据库中创建视图('A ='|| a ||'B ='||'C ='c ..)或rowid - 通过此视图创建JPA实体类 - 使用@Id注释

标记虚拟列

就是这样。更新/删除数据操作也是可能的(不插入)但如果虚拟键列不是由rowid组成的话我不会使用它们(以避免数据库表进行全扫描搜索)

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

答案 5 :(得分:0)

您需要创建主键,如果未找到任何符合条件的字段,则创建自动增量ID。

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