当前位置: 首页 > 面试题库 >

JPA /休眠-无法添加或更新子行:外键约束失败-BUT记录存在

黄泰宁
2023-03-14
问题内容

我有一个奇怪的问题。我在数据库中有一些记录:

公司

  • id = 1,名称= Microsoft
  • id = 2,名称= Sun

现在,我有另一个实体Event,它具有对Company的外键引用:

@Entity
public class Event {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @ManyToOne
    private Company company;
}

在我的Web服务层中,我使用作为URL参数传递的公司ID创建事件:

@GET
@Path("addEvent")
public String addEvent(@QueryParam("cid") long companyId) {
    Company alreadyInDB = new Company();
    alreadyInDB.setId(companyId);

    Event event = new Event();
    event.setCompany(alreadyInDB);
    eventService.addEvent(event);
}

这比调用EventService更重要。我最初使用的是注释掉的代码行。但是当由于外键约束失败而失败时,我添加了代码以确保Company记录存在。果然,代码会打印出正确的ID。但是它仍然失败,并违反了外键约束。

@Service("eventService")
public class EventService {

    @Autowired
    EventDAO eventDAO;

    @Autowired
    CompanyDAO companyDAO;

    @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
    public void addEvent(Event event) throws Exception
    {
        System.out.println("Company ID: " + event.getCompany().getId());

        Company ensureRecordExists = companyDAO.findById(event.getCompany().getId());
        System.out.println("ensureRecordExists: " + ensureRecordExists.getId());
        event.setCompany(ensureRecordExists);
        //event.setCompany(companyDAO.getReferenceById(event.getCompany().getId()));
        eventDAO.persist(event);
    }
}

这是stacktrace的相关部分:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`blah`.`event`, CONSTRAINT `FKE7E9BF09F9DCA789` FOREIGN KEY (`company_id`) REFERENCES `Company` (`id`))
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

知道发生了什么吗?我可以实际看到该记录存在于mysql工作台中。我不知道为什么它失败了。我认为这可能与刷新会话或某些事务性问题有关…?但是我看到了记录…


问题答案:

我将问题缩小了范围,并在此处发布了另一个问题:

JPA /hibernate-实体名称似乎很重要。如果我重命名为“
Bob”,效果很好

我在这里找到解决方案:

http://developmentality.wordpress.com/2011/05/23/hibernate-mysql-mac-foreign-
key-nightmares-a-painless-solution-to-a-painful-
problem/

由于mysql,hibernate和mac os
x的组合,存在一些问题,您必须在hibernate中使用小写命名策略。默认情况下,Hibernate使用驼峰式命名策略。



 类似资料:
  • 我有两个表,当我试图保存通常的实体,扔 组织。springframework。刀。DataIntegrityViolationException:无法添加或更新子行:外键约束失败(,约束外键(,)引用(,));SQL[n/a];约束[null];嵌套的异常是org。冬眠例外ConstraintViolationException:无法添加或更新子行:外键约束失败(,constraint外键(,)参

  • 问题内容: 当我不想相互连接两个表时,我得到以下消息:#1452-无法添加或更新子行:外键约束失败....我想从facebook_users表格中连接oauth_uid2(主键)外键为oauth_uid2的错误列表。但是我总是得到这个信息。我已经清除了数据,但没有任何效果。在表users_facebook中,我还有1条记录。 1452-无法添加或更新子行:外键约束失败(。,在更新级联上删除级联时使

  • 我知道在这个问题上有很多问题,但我一直未能解决。我正在做一个图形界面来添加/删除员工和管理缺勤。 我一直在阅读和测试那些建议stackOverflow1,但我不能更改数据库,因为它已经由我们的教授给出了。 来自外键的值已经在表“service”中,我在代码中称之为“department”。 我有以下数据库(对于我得到问题的表): 在应用程序中,您可以看到这里和下面的图片,我必须修改员工数据,并将其

  • 当我不想将两个表相互连接时,我收到消息:#1452 - 无法添加或更新子行:外键约束失败....我想使用外键oauth_uid2将oauth_uid2(主键)从facebook_users选项卡连接到错误选项卡。但我总是收到这个信息。我已经清除了我的数据,但没有任何效果。同样在表中users_facebook我有 1 条记录。 1452-无法添加或更新子行:外键约束失败(., CONSTRAINT

  • 如果我插入: 我用visual studio代码和mysql控制台的源代码编写代码 第一表: 第二表: 第三表: 我收到消息: 错误1452(23000):无法添加或更新子行:外键约束失败(。,约束外键()在更新级联的删除级联上引用() 请帮帮我:(,,thx:)

  • 错误代码:1452。无法添加或更新子行:外键约束失败(.,约束外键()引用()) 我看过其他关于这个话题的帖子,但没有运气。我是不是在监督什么或者知道该怎么做?