2015-03-23 6 views
1

У меня есть класс сущности, сопоставленный с существующей таблицей. В этой таблице нет первичного ключа. Вот таблица:JPA - Создать первичный ключ Transient

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 как переходный первичный ключ, который укажет на существующие поля базы данных. Что-то вроде указателя inorder, чтобы иметь возможность получать значения существующих полей. Это возможно?

Вот класс сущности:

@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; 
} 
+0

Есть ли какой-либо набор полей в таблице, который однозначно идентифицирует запись? –

+0

Ваше заявление о том, что вы не можете использовать JPA без PRIMARYKEY, полностью составлено: https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequision#No_Primary_Key. Пожалуйста, не утверждайте свои предположения, как они были фактом, большое спасибо – specializt

+0

да. поле1 поле2 и поле3 могут однозначно идентифицировать запись. или вы имеете в виду, если есть столбец id (int)? – fnkbz

ответ

1

Да. поле1 поле2 и поле3 могут однозначно идентифицировать запись

В этом случае рассмотрим возможность использования @EmbeddedId для составного ПК.

EDIT: гиперссылка обновлена ​​

По Oracle specification:

Каждый объект JPA должен иметь первичный ключ, который однозначно идентифицирует его от других экземпляров. Первичный ключ (или поля, содержащиеся в сложном первичном ключе) должны быть постоянными.

+0

спасибо большое. ваш ответ привел меня к этому примеру. http://patrickgrimard.com/2011/03/27/using-the-jpa-embeddable-annotation-to-create-your-own-composite-keys/ – fnkbz

+0

не знал, что вы можете заменить '@ EmbeddedId' на '@ Id', попробуйте это сделать –

+0

btw, как только ваше имя поля будет соответствовать аннотации имени свойства @Column (name = ...), можно опустить (принцип соглашения над конфигурацией является одним из моих фаворитов). –

1

Если это преходяще, чем он не отображается в БД.

Тот факт, что первичный ключ, определенный в БД, не мешает вам использовать его в JPA, DB просто не применяет к нему уникальные ограничения.

Что вам нужно, это составной первичный ключ в JPA, который состоит из поля 1 в поле3.

Но это будет работать только в том случае, если вы всегда хотите обрабатывать эти 3 поля как ваш «переходный первичный ключ», как вы его называете.

Смежные вопросы