So ordnen Sie einen zusammengesetzten Primärschlüssel in JPA zu, wobei ein Teil des Primärschlüssels ein Fremdschlüssel ist

Ich versuche herauszufinden, wie JPA-Entity-Beans erstellt werden, damit die Daten für meine Geräte funktionieren. Die Datenbank ist alt und in Stein gemeißelt, daher kann ich das Schema nicht ändern. "Gerätemodelle" hat einen zusammengesetzten Primärschlüssel, wobei eine der Spalten "FK to Device Type" ist.

Ich habe ein paar verschiedene Dinge ausprobiert. Zuerst hatte das Gerät ein DeviceModel und einen DeviceType, aber das gab mir den Fehler, dass zu viele Dinge auf dev_type verweisen. Also habe ich versucht, DeviceModel einen Verweis auf DeviceType zu geben, aber ich bin auf den gleichen Fehler gestoßen.

Wenn es hilft / wichtig ist, verwende ich Spring Data 4.2.x und Hibernate 4.3.8.Final, um alles zu sichern.

Weitere Antworten, die ich online gefunden habe (z. B.So erstellen und verarbeiten Sie einen zusammengesetzten Primärschlüssel in JPA) helfen mir nicht, da sie nur grundlegenden Datentypen zugeordnet sind. Tatsächlich ist die Antwort oben in meinem Code unten implementiert ... aber ich muss eine Ebene weiter gehen.

Das Schema:

create table devices
(
  device_nbr serial(1),
  device_id nchar(20) not null unique,
  dev_type integer not null,
  model_nbr integer default 1,
  unit_addr nchar(32),
  primary key (device_nbr),
  foreign key (dev_type) references devtypes (dev_type),
  foreign key (dev_type, model_nbr) references devmodels (dev_type, model_nbr)
);

create table devmodels
(
  dev_type      integer  not null,
  model_nbr     integer  not null,
  model_desc    nchar(20),
  primary key (dev_type, model_nbr),
  foreign key (dev_type) references devtypes (dev_type)
);

create table devtypes
(
  dev_type integer not null,
  dev_desc nchar(16) not null unique,
  primary key (dev_type)
);

Meine Beans (die DeviceType nicht an Device oder DeviceModel binden, dafür brauche ich Hilfe):

@Entity
@Table(name = "devices")
public class Device
{
    @Id
    @GeneratedValue
    @Column(name = "device_nbr")
    private Long                number;

    @Column(name = "device_id", length = 30)
    private String          id;

    @Column(name = "unit_addr", length = 30)
    private String          unitAddress;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "dev_type"),
        @JoinColumn(name = "model_nbr")
    })
    private DeviceModel deviceModel;

...Getters and setters
}

public class DeviceModelPK implements Serializable
{
    private static final long   serialVersionUID    = -8173857210615808268L;
    protected Integer                   deviceTypeNumber;
    protected Integer                   modelNumber;

...Getters and setters
}

@Entity
@Table(name = "devmodels")
@IdClass(DeviceModelPK.class)
public class DeviceModel
{
    @Id
    @Column(name = "dev_type")
    private Integer         deviceTypeNumber;

    @Id
    @Column(name = "model_nbr")
    private Integer         modelNumber;

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

...Getters and setters
}

@Entity
@Table(name = "devtypes")
public class DeviceType
{
    @Id
    @GeneratedValue
    @Column(name = "dev_type")
    private Integer number;

    @Column(name = "dev_desc", length = 30)
    private String  description;

...Getters and setters
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage