Raf*_*afe 7 java mysql orm hibernate
我希望有人之前遇到过这个问题,可以帮助我.基本上,Hibernate插入父行(ID指向子行),但不插入具有关联ID的子行,这使数据库处于错误状态.这是Hibernate尝试加载未正确保存的对象时抛出异常的示例:
27 Jun 2011 13:55:31,380 ERROR [scheduler_Worker-4] -
Job DEFAULT.queryScrubJobDetail threw an unhandled Exception:
org.springframework.scheduling.quartz.JobMethodInvocationFailedException:
Invocation of method 'doIt' on target class [XXX] failed; nested exception is
org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException:
No row with the given identifier exists:
[XXX.DataProviderTransaction#60739703]; nested exception is org.hibernate.ObjectNotFoundException:
No row with the given identifier exists:
[com.idology.persist.DataProviderTransaction#2]
Run Code Online (Sandbox Code Playgroud)
这部分应用程序有三个实体:
以下是映射:
来自查询:
@OneToMany(mappedBy = "query", cascade =
{ CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
@JoinColumn(name = "query_id")
public List<DataProviderTransactionReference> getDataProviderTransactionReferences()
Run Code Online (Sandbox Code Playgroud)
来自DataProviderTransaction:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "query_id")
public Query getQuery()
Run Code Online (Sandbox Code Playgroud)
来自DataProviderTransactionReference:
@ManyToOne(cascade =
{ CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER)
@JoinColumn(name = "data_provider_transaction_id")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
public DataProviderTransaction getDataProviderTransaction()
{
return mDataProviderTransaction;
}
Run Code Online (Sandbox Code Playgroud)
模式看起来像这样(省略查询表,因为它没有外键):
data_provider_transaction
+------------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+---------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| query_id | bigint(20) | YES | MUL | NULL | |
+------------------+---------------+------+-----+---------+----------------+
data_provider_txn_refs
+------------------------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------------------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| created_at | datetime | YES | | NULL | |
| data_provider_transaction_id | bigint(20) | YES | MUL | NULL | |
| query_id | bigint(20) | YES | MUL | NULL | |
+------------------------------+------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
所以一旦我们完成了运行查询(由Query对象表示),我们使用Spring和Hibernate使用以下命令保存它:
getHibernateTemplate().saveOrUpdate(aQuery);
Run Code Online (Sandbox Code Playgroud)
Query与相关的DataProviderTransaction和DataProviderTransactionReference实体一起保存.除此之外,它有时会保存Query和DataProviderTransactionReference,而不会保存关联的DataProviderTransaction.它确实在data_provider_transaction_id中放置了一个ID,但它指向data_provider_transaction表中不存在的行.
下一步是添加外键约束以在我们执行初始保存时发生问题,而不是在我们稍后尝试加载对象时.
我们使用的是Spring 2.5.6,Hibernate 3.3.2和MySQL 5.0.我已经看到多年来早期版本的Spring和Hibernate出现了这个问题.
有谁见过/解决了这个问题?
这听起来像是 MySQL 的 id 分配问题。如果生成器未正确声明,或者您对代码做了奇怪的事情,Hibernate 可能会感到困惑。
您是否有孤立的 DataProviderTransactions 或 DataProviderTransactionReferences、具有不存在的查询 id 的 DataProviderTransaction,或者指向错误的查询?
你的生成器是否被声明为你的 ids 的身份?(请参阅第 5 章“基本 O/R 映射”,第 5.1.4 节 id。通常,这应该足够了,但您可能正在做的其他事情使 hibernate 感到困惑。
因此,例如:
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
Run Code Online (Sandbox Code Playgroud)
要真正追踪到这一点,您需要知道为什么会发生这种情况,谁在插入这些行。您需要在数据库中添加外键约束。也有可能某些东西正在删除 DataProviderTransaction 并且数据库没有抱怨,因为没有外键。
| 归档时间: |
|
| 查看次数: |
2678 次 |
| 最近记录: |