3

アプリケーションに 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(行番号:)で検索しようとします。

これのどこが間違っているのでしょうか?

4

1 に答える 1

1

これが最善の解決策かどうかはわかりませんが、コマンドで@NotFound注釈を使用IGNOREして、Hibernate に例外と設定pluginConfigを破棄させることができますnull

@OneToOne
@JoinColumn(name = "plugin_config_id")
@NotFound(action = NotFoundAction.IGNORE)
private PluginConfig pluginConfig;
于 2013-08-25T16:16:15.677 に答える