Составной первичный ключ в JPA со структурой значения ключа в дочерней таблице - PullRequest
0 голосов
/ 24 июня 2018

У меня есть 2 таблицы с OneToMany правами и созданные объекты, как показано ниже

Таблица 1- Сеть имеет первичный ключ в качестве идентификатора сети

Таблица 2- NetworkAttributes имеет FK в качестве networkId, но записи следует рассматривать как уникальные, объединяя " networkId " и " name " column [ имя столбца в таблице атрибутов отсутствует в таблице сети ], и здесь я сохраняю значение по умолчанию для нескольких сетевых параметров, и параметры могут повторяться в разных сетях в соответствии с приведенной ниже структурой таблицы в " NetworkAttributes »

Структура таблицы: -

Таблица сети :

 networkID | networkName | networkType

  H123M       nrouter      X
  N123Y       testR        J

Таблица сетевых атрибутов : [тип хранения ключей для значений по умолчанию]

 networkID   | name          |   value

  H123M       maxIpUser          10
  H123M       maxRouterUser      15
  N123Y       maxIpUser          23
  N123Y       maxRouterUser      25

Сетевой объект: -

@Entity
@Table(name = "NETWORK")
public class Network implements Serializable {

private static final long serialVersionUID = 1L;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;

@Id
@NotNull
@Column (name = "NETWORKID")
private String networkId;

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

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

@Column (name = "onlyActive")
private boolean onlyActive;

@OneToMany (fetch = FetchType.LAZY, mappedBy = "network")
private List<NetworkAttributes> networkAttributes;

  // Setter / Getter

Сетевой атрибут объекта: -

 @Entity
 @Table (name = "NETWORK_ATTRIBUTES")
 public class NetworkAttributes implements Serializable {

private static final long serialVersionUID = 1L;

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

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

@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn (name = "network_Id")
private Network network;

// setter / getter

Проблема: С этой структурой таблицы я не могу вставить разные параметры для одних и тех же сетей в таблицу Network Attributes . дает уникальную ошибку ограничения. Любое предложение, пожалуйста

Например, вы можете видеть, что я пытаюсь вставить записи ниже, но поскольку networkId как FK, он не позволяет вставлять 2-ю и 4-ю записи.

  H123M       maxIpUser          10
  H123M       maxRouterUser      15
  N123Y       maxIpUser          23
  N123Y       maxRouterUser      25

1 Ответ

0 голосов
/ 24 июня 2018

Это «производная идентичность», поэтому NetworkAttributes может быть сопоставлен с @EmbeddedId, например:

@Embeddable
public class NetworkAttributesId {
    String name;
    String networkId; // corresponds to PK type of Network
}


@Entity
@Table (name = "NETWORK_ATTRIBUTES")
public class NetworkAttributes implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    NetworkAttributesId id;

    @ManyToOne (fetch = FetchType.LAZY)
    @JoinColumn (name = "network_Id")
    @MapsId("networkId") // maps networkId attribute of embedded id
    private Network network;

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

    ...
}

Производные идентификаторы обсуждаются (с примерами) в JPA 2.2.spec в разделе 2.4.1.

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