私のデバイス用のデータを取得するためにJPA Entity Beanを構築する方法を理解しようとしています。データベースは古くて石であるので、スキーマを変更することはできません。デバイスモデルには複合主キーがあり、列の1つはFKからデバイスタイプです。主キーの一部が外部キーであるJPAでの複合主キーのマッピング方法
私はいくつかのことを試しました。まずDeviceにDeviceModelとDeviceTypeがありましたが、dev_typeを参照しているものが多すぎるというエラーが表示されました。そこでDeviceModelにDeviceTypeへの参照を持たせようとしましたが、同じエラーが発生しました。
私が役立つならば、Spring Data 4.2.xとHibernate 4.3.8.Finalを使用してすべてを戻します。
私がオンラインで見つけたその他の回答(How to create and handle composite primary key in JPAなど)は、基本的なデータ型にのみ対応しているため、助けにはなりません。実際、上記の答えは私のコードで実装されています...しかし、私はさらに1レベル進む必要があります。
スキーマ:(それは私が助けを必要とするものだが、デバイスまたはデバイスモデルのいずれかにDeviceTypeをネクタイしていない)、これまで
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)
);
マイビーンズ:
@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
}
可能性のある重複した[作成し、JPAで複合主キーを処理する方法](http://stackoverflow.com/questions/13032948/how-to-create-and-handle-composite-primary-key- in-jpa) –
'@ IdClass'の代わりに' @ EmbeddedId'を試してみませんか? '彼らは基本的なデータ型にのみマップするので'あなたはこれについてのリファレンスを見つけましたか? –
私は '@ EmbeddedId'を試していませんが、同じ列を参照する2つの異なるJavaフィールドの問題をどのように解決するかはわかりません。 –