Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行,但确实存在_Java_Sql_Hibernate_Jakarta Ee - Fatal编程技术网

Java org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行,但确实存在

Java org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行,但确实存在,java,sql,hibernate,jakarta-ee,Java,Sql,Hibernate,Jakarta Ee,我有一个无法修复的休眠问题 设置:JavaEE、web应用、Hibernate3.2、Tomcat6、Struts2 基本上,我用我的服务器逻辑(struts操作)持久化一个对象,然后尝试将该数据拉出来,用于下一页并显示它 保存对象后,我会检查数据库,果然,我可以看到包含所有数据的行 但当我尝试检索它时,我得到了以下结果: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [msc.mo

我有一个无法修复的休眠问题

设置:JavaEE、web应用、Hibernate3.2、Tomcat6、Struts2

基本上,我用我的服务器逻辑(struts操作)持久化一个对象,然后尝试将该数据拉出来,用于下一页并显示它

保存对象后,我会检查数据库,果然,我可以看到包含所有数据的行

但当我尝试检索它时,我得到了以下结果:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [msc.model.Picture#73]
为了让事情变得更糟,当我重新启动Tomcat并尝试访问同一个对象时,我没有得到错误——Hibernate发现行很好

如果我执行其他一些操作,Hibernate也将能够看到该行——可能会在数据库中添加一行,甚至不在同一个表上

从所有这些我怀疑一个休眠错误,但我是一个休眠新手,所以我可能是错的。请帮忙!我在谷歌上搜索了又搜索,结果一无所获

这是我的Hibernate配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/msc</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">-------</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">80</property>
        <property name="current_session_context_class">thread</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <mapping resource="msc/model/Picture.hbm.xml"/>
        <mapping resource="msc/model/Comment.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
显示数据的代码(本例中为图像)


我在代码中没有看到与异常相关的任何实际问题,您可能希望尝试:

  • 检查事务是否已刷新,或在提交后手动调用
    flush()
  • 检查是否将ID传递给
    load()
    ,以及是否通过调试器将正确的ID传递给它
  • 启用Hibernate打印生成的SQL和/或启用日志记录

检查所有映射和数据库设置。当数据库显示nullable=“true”时,您可能正在外键关系中设置一些notnull=“true”。第一个导致内部联接,第二个导致左联接


将log level设置为TRACE以查看所有步骤,并在检索对象时查找生成的SQL。

好的,我将在这里抛出一个理论。是否在事务提交之前第一次尝试加载图片

由于事务尚未提交,因此您用于读取图片的事务看不到该行(取决于您的事务隔离级别)

然后,由于
hib_session.close()
不在
finally
块中,因此它不会被执行,线程绑定的会话仍将有一个打开的事务。随后的请求使用相同的打开事务获得相同的Hibernate会话,并且您从select it问题中获得相同的结果(同样,取决于事务隔离级别-请参阅,特别是可重复的_读取)

这也可以解释为什么
flush()
会稍微好一点,因为如果
flush()
发生的时间早于
commit()
,则出现争用条件的可能性较小


我建议您尝试在finally块中关闭会话,看看后续请求的行为是否会发生变化。

我在hibernate 3.6.10中遇到类似问题,而我只是在搜索和选择(如果存在)

注释:

@Entity
public class Familiares {
@OneToMany(mappedBy = "familiares")
private List<FamiliaresBaja> bajas;

@Entity
@Table(name = "familiares_baja")
public class FamiliaresBaja implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @JoinColumn(name = "familiares_id")
    @ManyToOne(optional = false)
    private Familiares familiares;

这一定是Hibernate错误

发生这种情况是因为您插入了外键,但没有引用任何内容。
检查您的数据库是否存在该键(即使它在其他表的数据库中)。

请检查mysql服务器的小写字母表名的值。如果其值为0,请检查hibernate生成的SQL,确保表名的大小写与mysql中的实际表名一致。

只需检查您的数据库id 73是否在特定表中可用。

在多对一关系中,您需要告诉hibernate如果找不到映射行,需要执行哪些操作。您可以通过以下方式对其进行配置:

Annotation:
@NotFound(action = NotFoundAction.IGNORE)
Mapping XML:
<many-to-one name="user" column="user_id" class="com.xyz.User" cascade="save-update, evict" not-found="ignore"/>
注释:
@NotFound(action=NotFoundAction.IGNORE)
映射XML:

我遇到了这个问题,下面是发生了什么以及我是如何解决的。你很可能也在做同样的事情

我有POST和USER对象。他们是一对一的关系(一个用户可以有很多帖子)。使之双向,他们也处于多人关系中(一篇帖子只属于一个用户)

课后造型

@Entity
@Table(name="Post")
public class Post {

@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private long postId;
private String title;
private String body;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "postUserId")
private AutoUser autoUser;
// getter and setters
用户类是

@Entity
@Table(name = "AUTO_USER")
public class AutoUser implements UserDetails {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long autoUserId;

@Column(name = "USERNAME")
private String username;

@OneToMany
private List<Post> postList = new ArrayList<>();
  // getter and setters
这告诉我id为2的用户对象在新用户表中不可用

然后我又注册了一个id为2的用户,后来我得到了这个

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tadtab.core.authentication.AutoUser#3
这次它找不到id为3的用户

最后注册了第三个用户,没有例外

如您所见,该外键存在于post表中,但由于我更改了用户表,因此它们无法匹配,这就是我面临此问题的原因

为了避免这种情况,我为这两个对象创建了新的表名,并重新开始


希望这将有助于检查触发器,如果您有一个before insert触发器,并且序列中有NEXTVAL,则会导致该错误

您正在查找的实体中可能存在一对一的关系,但需要使用不同的ID,请尝试在映射表中加载具有ID的实体,而不是在标识列中加载实体。

解决此问题的正确方法是使用
会话.get()
方法。如果找不到实体,Get方法将返回
null

getId()的作用是什么?
Picture
类的
@Id
属性是什么?@GrzegorzGrzybek Id属性显示在映射中,它只是一列。@NastyPasty我也有同样的问题;你有没有想过这个问题,如果没有,你是如何解决的?我尝试了所有3个建议,但没有一个有效,尽管flush()使它发生的频率降低了(也就是说,它有时会起作用!非常奇怪)。还有其他想法吗?@nastypasty嗯,至少可以说,这很奇怪。我能想到的最好的方法是设置Hibernate日志配置并检查跟踪级别日志,这应该会告诉您问题所在&对于如此小的插入,它们应该是可读的。你需要
createQuery("from FamiliaresBaja where familiares.id="+ id).uniqueResult() // should return a single result or null not throw a Exception
Annotation:
@NotFound(action = NotFoundAction.IGNORE)
Mapping XML:
<many-to-one name="user" column="user_id" class="com.xyz.User" cascade="save-update, evict" not-found="ignore"/>
@Entity
@Table(name="Post")
public class Post {

@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private long postId;
private String title;
private String body;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "postUserId")
private AutoUser autoUser;
// getter and setters
@Entity
@Table(name = "AUTO_USER")
public class AutoUser implements UserDetails {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long autoUserId;

@Column(name = "USERNAME")
private String username;

@OneToMany
private List<Post> postList = new ArrayList<>();
  // getter and setters
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tadtab.core.authentication.AutoUser#2
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tadtab.core.authentication.AutoUser#3