JPA EntityManager remove() 无效

上周发现一个问题,删除一条记录的时候发现无法删除,然后排查的时候一行一行定位代码,用的是JPA,删除功能是这样写的:

@Override
    public void deleteById(Long id) {
    	Company company = this.findById(id);
    	System.out.println("查出来的company: " + company);
    	em.remove(company);
        System.out.println("删除company成功");
    }

实际结果是记录并没有删掉,难道是 em.remove(company); 这句没执行吗?也不对,因为后面的print语句都输出了,说明删除操作肯定是执行的,但因为某种原因没有成功。

那么原因在哪里呢?查资料、折腾了一天也没查出来。

后来进行了对比排查,Company 类无法删除,但是Farmer 类却可以,于是观察两者有什么区别,网上查到很多文章说remove(entity)不起作用的话是因为有外键关联,于是开始对比:

首先看数据库表, company 和 farmer表都和town表有多对一关系,通过town_id关联,但在数据库中并没有设置外键,也就是说mysql是不知道的,因此不会进行干涉。

然后看java类,在类中,Company 和 Farmer 确实和Town类设置了多对一关系(Company类和Farmer类都是这样写的):

@ManyToOne
    @JoinColumns({
            @JoinColumn(name = "TOWN_ID", nullable = false, referencedColumnName = "ID", insertable = false, updatable = false)
    })
    @JsonIgnore
    public Town getTown() {
        return town;
    }
于是尝试在Company类中删除这部分外键代码,发现报错;

这时,开始接近真相了,于是找出Town类来查看,终于发现问题了:

private String name;
    private List<Company> companys = new ArrayList<Company>();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
... ...

@OneToMany(cascade=CascadeType.ALL, mappedBy="town", fetch = FetchType.EAGER)
    @OrderColumn(name = "ID")
    @JsonIgnore
	public List<Company> getCompanys() {
		return companys;
	}


在Town类中,设置了与Company的一对多关联,但是没有和Farmer的关联,所以Farmer能删除,而Company因为和Town有外键关联所以无法删除。

尝试删除了Town类中的Company关联,然后问题解决,Company记录可以正常删除了!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这个错误的意思是无法打开JPA EntityManager进行事务操作,嵌套的异常信息是org.hibernate.exception.jdbcconnectionexception:无法获取JDBC连接。 ### 回答2: 这是一个比较常见的问题,出现在使用Hibernate做数据库操作时,通常是因为无法连接到数据库,或者数据库连接被阻塞而导致的。这个错误信息很明显,就是说无法打开JPA EntityManager用于事务处理,具体原因是嵌套异常org.hibernate.exception.jdbcconnectionexception:无法获取JDBC连接。 如果遇到这种问题,最好的办法就是检查一下数据库配置是否正确,包括数据库URL、用户名、密码等是否填写正确。同时也可以检查一下数据库是否已经启动,数据库中的表是否存在,以及数据库连接是否被占用等问题,通常在程序中出现这个问题都是因为其中一个原因导致了数据库连接失败。 如果以上方法都没有解决问题,还可以尝试清理一下JPA EntityManager,以及检查一下Hibernate映射文件是否正确、是否存在错误,通常情况下这些操作可以解决大多数原因导致的数据库连接问题。 总之,以上是绝大部分问题的解决办法,但是如果遇到更加复杂的问题,可能需要从数据库本身的角度来进行排查。 ### 回答3: 这个错误通常意味着应用程序在连接数据库时遇到了问题。应用程序试图使用Java持久性(JPA)实体管理器处理数据库事务,但无法获得JDBC连接。JDBC(Java数据库连接)使Java应用程序能够连接各种数据库,包括MySQL和Oracle等常用的关系型数据库。 在这个错误消息中,“嵌套异常”告诉我们具体的问题是“无法获得JDBC连接”。这可能是由于以下原因导致的: 1.数据库未运行 - 在尝试连接数据库之前,请确保数据库正在运行,并且您有足够的权限访问它。您可以通过在终端上运行命令行或使用图形用户界面来启动数据库。 2. 数据库连接配置错误 - 应用程序的配置可能包含错误的数据库连接字符串,用户名或密码。请确保这些值正确。 3. 数据库连接超时 - 如果数据库连接处于闲置状态一段时间,它可能已关闭。尝试增加连接超时值,让连接保持活动状态。 4. 数据库连接池未正确配置 - 如果使用连接池管理数据库连接,则必须正确配置连接池以保持应用程序的最佳性能。例如,如果连接池的最大连接数设置太低,则可能会遇到无法获得JDBC连接的错误。 要解决这个问题,您可以尝试以下步骤: 1.检查数据库是否正在运行,并确保您有权限访问它。 2. 查看应用程序的数据库连接配置,确保配置正确。如果发现错误,请进行更改并重试。 3. 尝试增加连接超时值,允许连接在空闲时保持活动状态。 4. 如果使用连接池管理数据库连接,请确保连接池正确配置,并且最大连接数不低于应用程序需要的连接数。 如果这些步骤无法解决问题,请尝试其他方法,例如检查网络连接是否正常,重启数据库或应用程序服务器,或联系相关技术支持人员寻求帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹰信息技术服务部

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值