我正在为我的应用程序使用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”的值)搜索它。
我可以在哪里出错?
答案 0 :(得分:1)
我不知道这是否是最好的解决方案,但您可以使用@NotFound
注释和IGNORE
命令让Hibernate丢弃异常并将pluginConfig
设置为null
@OneToOne
@JoinColumn(name = "plugin_config_id")
@NotFound(action = NotFoundAction.IGNORE)
private PluginConfig pluginConfig;