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

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

公司

  • 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使用驼峰式命名策略。

以上是 JPA /休眠-无法添加或更新子行:外键约束失败-BUT记录存在 的全部内容, 来源链接: utcz.com/qa/415841.html

回到顶部