Cómo asignar una clave primaria compuesta en JPA, donde parte de la clave primaria es una clave externa

Estoy tratando de descubrir cómo construir beans JPA Entity para que los datos funcionen para mis dispositivos. La base de datos es antigua y en piedra, por lo que no puedo cambiar el esquema. Los modelos de dispositivo tienen una clave primaria compuesta, donde una de las columnas es un FK a Tipo de dispositivo.

He intentado un par de cosas diferentes. Primero fue que el Dispositivo tenía un Modelo de Dispositivo y un Tipo de Dispositivo, pero eso me dio el error de que demasiadas cosas hacían referencia a dev_type. Entonces intenté que DeviceModel tuviera una referencia a DeviceType pero me encontré con el mismo error.

Si ayuda / importa, estoy usando Spring Data 4.2.xy Hibernate 4.3.8.Final para respaldar todo.

Otras respuestas que he encontrado en línea (comoCómo crear y manejar clave primaria compuesta en JPA) no me ayudan, ya que solo se asignan a tipos de datos básicos. De hecho, la respuesta anterior se implementa en mi código a continuación ... pero necesito ir 1 nivel más allá.

El esquema:

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)
);

Mis Beans hasta ahora (que no vinculan DeviceType a Device o DeviceModel, eso es con lo que necesito ayuda):

@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
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta