我在我的应用程序中使用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标记(红色交叉),错误为“实体没有定义主键属性”。
有谁能告诉我,如何创建没有主键的实体?
感谢。
答案 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));