埋め込みID値がシーケンス化されていないか生成されていても、場合は、私はCustomDeviceModelsのリストを持つCustomDeviceTypeを持っているということです。ユーザーが新しいCustomDeviceTypeを作成すると、IDに使用された番号を含む属性が提供されます。 CustomDeviceTypeに接続されている各CustomDeviceModelについても同様です。エンハンストIDを持つ新しいエンティティにユーザが提供する値を持つ永続エンティティ
表devmodelsに(dev_type、model_nbr)の複合主キーがあるため、私はCustomDeviceModelのEmbeddedEdを作成しました。私は次のエラーを取得するCustomDeviceType持続しようとすると:
javax.persistence.EntityNotFoundException: Unable to find com.etisoftware.manager.beans.cborg.devices.CustomDeviceModel with id [email protected]
DeviceModeIdが値を持っているので、ビューの休止状態の観点から理にかなって、それがデータベースに存在しなければなりません。しかし、それはしません。
私はこのテーブルの設定を変更できません。新しいCustomDeviceModelsを保存できるようにエンティティを設定するにはどうすればよいですか?
私は2つのテーブルdevtypesとdevmodelsあります
CREATE TABLE devtypes (
dev_type integer NOT NULL,
dev_desc nchar(16) NOT NULL,
off_premise integer NOT NULL,
unrouteable integer DEFAULT 0 ,
custom_models integer DEFAULT 0 ,
force_case nchar(1) DEFAULT 'U ',
has_siblings integer DEFAULT 0 ,
PRIMARY KEY (dev_type)
);
CREATE TABLE devmodels (
dev_type integer NOT NULL,
model_nbr integer NOT NULL,
model_desc nchar(20),
cablecard integer DEFAULT 0 ,
ont_type integer DEFAULT 0 NOT NULL,
ont_port_type nchar(1) NOT NULL,
PRIMARY KEY (dev_type,model_nbr)
);
ALTER TABLE devmodels
ADD CONSTRAINT FOREIGN KEY (dev_type)
REFERENCES devtypes (dev_type);
を私は次のエンティティを持っている:
@Entity
@Table(name = "devtypes")
public class CustomDeviceType
{
@Id
@Column(name = "dev_type")
private Integer number;
@Column(name = "dev_desc")
private String name;
@Column(name = "unrouteable")
private Boolean unrouteable;
@Column(name = "off_premise")
private Boolean offPremise;
@Column(name = "has_siblings")
private Boolean hasSiblings;
@OneToMany(mappedBy = "deviceType", fetch = FetchType.LAZY)
private Set<CustomDeviceModel> deviceModels;
// Setters
}
@Entity
@Table(name = "devmodels")
public class CustomDeviceModel
{
@EmbeddedId
private DeviceModelId id;
public CustomDeviceModel()
{
id = new DeviceModelId();
}
@Column(name = "model_desc")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dev_type")
@MapsId("deviceTypeNumber")
private CustomDeviceType deviceType;
@OneToOne(mappedBy = "deviceModel", fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "dev_type"), @JoinColumn(name = "model_nbr") })
private CustomDeviceTypeConfig deviceConfig;
public Integer getNumber()
{
return id.getNumber();
}
public void setNumber(Integer number)
{
id.setNumber(number);
}
public void setDeviceType(CustomDeviceType deviceType)
{
this.deviceType = deviceType;
id.setDeviceTypeNumber(deviceType.getNumber());
}
public CustomDeviceTypeConfig getDeviceConfig()
{
return deviceConfig;
}
public void setDeviceConfig(CustomDeviceTypeConfig deviceConfig)
{
this.deviceConfig = deviceConfig;
id.setDeviceTypeNumber(deviceConfig.getDeviceModel().getDeviceType().getNumber());
id.setNumber(deviceConfig.getDeviceModel().getNumber());
}
// other setters
}
@Embeddable
public class DeviceModelId implements Serializable
{
private static final long serialVersionUID = 5215223205194404431L;
private Integer deviceTypeNumber;
@Column(name = "model_nbr")
private Integer number;
public Integer getNumber()
{
return number;
}
public void setNumber(Integer number)
{
this.number = number;
}
public Integer getDeviceTypeNumber()
{
return deviceTypeNumber;
}
public void setDeviceTypeNumber(Integer deviceTypeNumber)
{
this.deviceTypeNumber = deviceTypeNumber;
}
@Override
public int hashCode()
{
return new HashCodeBuilder().append(deviceTypeNumber).append(number).toHashCode();
}
@Override
public boolean equals(final Object object)
{
if (object instanceof DeviceModelId)
{
final DeviceModelId other = (DeviceModelId) object;
return new EqualsBuilder().append(deviceTypeNumber, other.getDeviceTypeNumber()).append(number, other
.getNumber()).isEquals();
}
return false;
}
}