アプリケーションに Hibernate(3.0) + Oracle DB (10g) を使用しています。
私のドメイン オブジェクトは PluginConfig.java のようなものです
@Entity
@Table(name = "plugin_config" , schema = "test")
@org.hibernate.annotations.Cache(usage =org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
public class Config {
private static final long serialVersionUID = -1959019321092627830L;
/** This object's id */
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected long id;
@OneToOne
@JoinColumn(name = "plugin_id")
private Plugin plugin;
@Column(name = "config_name")
@NaturalId(mutable = true)
private String name;
@Column(name = "config_desc")
private String description;
別のドメイン オブジェクト Plugin.java
@Entity
@Table(name = "plugin", schema = "test")
@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
public class Plugin implements Serializable {
private static final long serialVersionUID = 5694761325202724778L;
/** This object's id */
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected long id;
@Column(name = "plugin_name")
@NaturalId
private String pluginName;
@OneToOne
@JoinColumn(name = "plugin_config_id")
private PluginConfig pluginConfig;
@Column(name = "plugin_desc")
private String description;
データベース サービス メソッドを介してプラグインをロードしようとすると (@Transactional アノテーションを使用するため、すべての子もロードされます)、次のエラーが発生します。
org.hibernate.ObjectNotFoundException: 指定された識別子を持つ行が存在しません: [PluginConfig#53]
実際には、plugin_config テーブルにid = 53
. また、プラグイン テーブル エントリにはplugin_config_id=53
.
では、休止状態はどこからこれらの値を選択しているのでしょうか? ここで 1 つのことに気付きました。値「53」は、実際には参照されるべき plugin_config テーブルの行番号です。
以下の画像を参照してください。
これは、クエリが探すべきプラグイン構成です。ただし、#95(主キー「id」の値)ではなく、識別子#53(行番号:)で検索しようとします。
これのどこが間違っているのでしょうか?