我在应用程序中使用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 ofROWID
- 没有良好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;