我正在为我的应用程序使用 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”的值)来搜索它。
我哪里出了问题?