当前位置: 首页 > 知识库问答 >
问题:

正在从DB、JPA中删除对象

金嘉言
2023-03-14

这是我的DAO方法:

public void deleteById(int id){
    TypedQuery<Animal> query = entityManager.createQuery("Select e from Animal e where e.id="+id, Animal.class);
    Animal entity = query.getSingleResult();
    System.out.println(entityManager.contains(entity));
    System.out.println(entity.hashCode());
    entity = entityManager.merge(entity);
    System.out.println("after merge");
    System.out.println(entity.hashCode());
    System.out.println(entityManager.contains(entity));
    entityManager.remove(entity);
}

这是我的控制器:

@RequestMapping("{animal}/{name}/{id}/delete")
public String dropAnimal(@PathVariable("id") int id){

    animalDAO.deleteById(id);
    return "glowny";
}

当我试图删除到对象时,删除分离的实例时出错。

我在合并前后做了sysout,都是false,但我不知道为什么。为什么我的对象仍然是分离的?

在stackTrace之前,我有这样的消息:

KWI21, 2016 10:47:45AMorg.apache.catalina.core.Standard ardWrapperValve在路径[/zapisywacz.baza]抛出异常的上下文中为servlet[mvc-调度器]调用SEVERE: Servlet.service()[请求处理失败;嵌套异常是org.springframework.dao.InvalidDataAccessApiUsageExctive:删除一个分离的实例kaczynski.impl.Cat#1;嵌套异常java.lang.IllegalArgumentExctive:删除一个分离的实例kaczynski.impl.Cat#1]具有根本原因

这是hascode的输出:

false
1870474474
after merge
445252736
false

坚持不懈xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="myDatabase" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.user" value="tutorial" />
        <property name="javax.persistence.jdbc.password" value="password" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mojaBaza" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect " />
        <property name="hibernate.hbm2ddl.auto" value="update" />
    </properties>
</persistence-unit>

动物实体

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Animal {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private int id;

    private String name;

    private int age;
    @Column(name="date_of_birth")
    private String dateOfBirth;

    private double weight;

    public Animal(String name, int age, String dateOfBirth, double weight) {
        this.name = name;
        this.age = age;
        this.dateOfBirth = dateOfBirth;
        this.weight = weight;
    }

    public Animal() {}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(String dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return " id= " + id + " name=" + name + ", age=" + age
                + ", dateOfBirth=" + dateOfBirth + ", weight=" + weight;
    }

    public String tease() {
        return "";
    }

    public String giveVoice() {
        return "";
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

共有2个答案

陶星波
2023-03-14

合并后,对象从会话中分离出来,要删除它,您必须再次找到它。

TypedQuery<Animal> query = entityManager.createQuery("Select e from Animal e where e.id="+id, Animal.class);
Animal entity = query.getSingleResult();
entityManager.remove(entity);
万铭
2023-03-14

我找到了解决办法,

在Spring配置中缺少,并且由于注释@Transactional,Spring不可见。

 类似资料:
  • 但仍然无法修复。我的目的是当用户在组合框中选择delete选项时,我只想完全删除该行。顺便说一下,removeRow()方法可以在侦听器外部正常工作。下面是代码和说明: 我是不是漏了什么重要的地方?如有任何帮助,我们将不胜感激。

  • 问题内容: 我正在尝试从ArrayList中删除一个对象。每个Item对象都有3个属性;1. itemNum 2.信息3.费用。我也有3个类,即1。Item类定义了存储在目录中的单个项目。2. Catalog类维护Item对象的列表。3带main方法的客户端类。我在Set类中具有设置并获取,在Catalog中具有ArrayList。在客户端中,提示我“输入要删除的itemNum。如何基于对item

  • 我刚加入弹性搜索公司。我正在想办法从ElasticSearch中删除数据。我已经删除了我的索引。然而,这似乎并没有真正删除数据本身。我看到的其他内容指向Delete by Query特性。然而,我甚至不确定该查询什么。我知道我的索引。从本质上说,我想弄清楚如何做一个 来自Chrome版邮递员。但是,我没有什么运气。好像不管我做什么,数据都挂在那里。到目前为止,我已经通过使用PostMan中的DEL

  • 我正在使用Laravel8开发我的项目,现在我想从DB中删除一个数据,所以我添加了这个表单: 下面是实现这一目标的途径: 这是控制器方法: 现在的问题是,它没有工作,我的意思是它抓取正确,但它显示404未找到页面不知怎么的! 而且我也测试了这个: 但仍然显示404 NOT FOUND页面,这意味着进程没有到达控制器方法! 那么我该如何解决这个问题呢? 我非常感谢你们的任何想法或建议... 多谢了。

  • 问题内容: 我有一个具有静态对象ArrayList的ClassA 现在,我要像这样从此列表中删除一个对象 这是用Meteorit类编写的。但是,当我想使用ArrayList中的对象时,它将引发异常。 我使用Iterator从ArrayList中删除对象,但是现在我不知道如何在这种情况下使用它。 问题答案: 这是因为某个线程实际上正在for每个循环中查看此列表,也许您正在尝试在for-each主体中

  • 问题内容: 如果我需要从List中删除一个对象(假设字符串“ abc” linkedList或ArrayList),则可以删除哪一个?(我认为两者都是相同的) ,如果我使用Linkedlist和arraylist,那么时间和空间的复杂度是多少 (我相信两者的时间复杂度都为O(n)相同) 问题答案: 两者都具有相同的时间复杂度-O(n),但是恕我直言,该版本会更快,尤其是在大型列表中,因为当您从数组