JPA - 创建瞬态主键

时间:2015-03-23 12:59:42

标签: java sql-server hibernate jpa

我有一个映射到现有表的实体类。该表没有主键。这是表格:

CREATE TABLE [dbo].[testtable](
[field1] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[field2] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[field3] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[field4] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[field5] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[field6] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
)

我无法对此表做任何更改,我试图通过仅在内存中设置主键来找到使用jpa的方法。我在理论上知道,如果我想在内存中只有列,我可以使用瞬态注释。我想将field1, field2, field3设置为指向现有数据库字段的瞬态主键。类似指针的东西,以便能够获取现有字段的值。这个可能吗?

这是实体类:

@Entity
@Table(name = "testtable")
public class TestJPA implements Serializable
{
 @Column(name = "field1")
 private String field1;

@Column(name = "field2")
private String field2;

@Column(name = "field3")
private String field3;

@Column(name = "field4")
private String field4;

@Column(name = "field5")
private String field5;

@Column(name = "field6")
private String field6; 
}

2 个答案:

答案 0 :(得分:1)

如果是暂时的,则不会映射到DB。

在DB中没有定义主键的事实并没有阻止你在JPA中使用它,在这种情况下DB只是没有强制执行唯一约束。

你需要它是JPA中的复合主键,它由field1到field3组成。

但只有当你总是希望将这3个字段视为你所谓的“瞬态主键”时,这才有效。

答案 1 :(得分:1)

  

是肯定的。 field1 field2和field3可以唯一地标识记录

在这种情况下,请考虑使用@EmbeddedId作为复合PK。

编辑:超链接已更新

根据Oracle specification

  

每个JPA实体必须具有唯一标识它的主键   来自其他实例。主键(或包含在其中的字段)   复杂的主键)必须是持久字段。