Композитный ключ с JPA для стола без ПК - PullRequest
0 голосов
/ 27 декабря 2018

Мне нужен список клиентов с идентификатором клиента, клиентами этого идентификатора (client) и именем клиента.Проблема в том, что эта таблица взята из dblink без PK

@Entity

@Table(name = "mytable", schema = "myschema")

public class Client {

    @Column(name = "clientid")
    @Id
    private Integer clientid;

    @Column(name = "client")
    private Integer client;

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

С этим кодом я получаю дублирующееся имя до конца списка, потому что нет PK и я не могуне запускать приложение без ПК.Нечто подобное происходит, когда я устанавливаю столбец клиента как PK (я правильно получаю все имена, но поле clientid показывает неправильное значение. Есть ли обходной путь для этого?

Пример данных:

Неверные данные (при настройке clientid как @Id):

[
  {
    "clientid": 99,
    "client": 81,
    "name": "Organization 1"
  },
  {
    "clientid": 99,
    "client": 81,
    "name": "Organization 1"
  },
  {
    "clientid": 99,
    "client": 81,
    "name": "Organization 1"
  }
]

Неверные данные (при установке клиента как @Id) :

[
  {
    "clientid": 99,
    "client": 81,
    "name": "Organization 1"
  },
  {
    "clientid": 3,
    "client": 99,
    "name": "Organization 2"
  },
  {
    "clientid": 3,
    "client": 127,
    "name": "Organization 3"
  }
]

Что я должен получить: (Клиент правильно во всех случаях)

[
  {
    "clientid": 99,
    "client": 81,
    "name": "Organization 1"
  },
  {
    "clientid": 3,
    "client": 99,
    "name": "Organization 2"
  },
  {
    "clientid": 1,
    "client": 127,
    "name": "Organization 3"
  }
]

1 Ответ

0 голосов
/ 28 декабря 2018

Вы должны создать составной ключ для правильной обработки ваших данных.Сначала создайте другой класс, который будет представлять ключ:

public class ClientPK implements Serializable{

    private static final long serialVersionUID = 1L;

    private Integer clientid;

    private Integer client;

    /*Constructor, getters and setters here*/
}

А затем обновите класс Client следующим образом:

@Entity
@Table(name = "mytable", schema = "myschema")
@IdClass(ClientPK.class)
public class Client {

    @Column(name = "clientid")
    @Id
    private Integer clientid;

    @Column(name = "client")
    private Integer client;

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

Лучше реализовать hashCode иequals метод в ClientPK классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...