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.

那么hibernate从哪里挑选这些值呢?我在这里注意到一件事,值“53”实际上是 plugin_config 表中应该被引用的行号。

见下图:

在此处输入图像描述

这是我的查询应该寻找的插件配置。但它尝试使用标识符#53(行号:)而不是#95(主键“id”的值)来搜索它。

我哪里出了问题?

4

1 回答 1

1

我不知道这是否是最好的解决方案,但是您可以使用@NotFound带有命令的注释IGNORE让 Hibernate 丢弃异常并设置pluginConfignull.

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