【发布时间】:2014-02-04 06:44:47
【问题描述】:
我正在使用 JPA 建立多对一关系。从子表中删除子对象时会引发异常。
下面是我的代码:
项目.java
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="projectName")
private String projectName;
@Column(name="projectDesc")
private String projectDesc;
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="companyId")
公司.java
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="compName")
private String compName;
@Column(name="address")
private String address;
下面是插入代码:
InserAction.java
public static void main(String[] args) {
Company comp2 = new Company();
comp2.setCompName("IBM");
comp2.setAddress("Bangalore");
Project pro2 = new Project();
pro2.setProjectName("Management System");
pro2.setProjectDesc("System");
pro2.setCompany(comp2);
EntityManager entityManager = EntityManagerUtil.getEmf().createEntityManager();
try{
EntityTransaction entr = entityManager.getTransaction();
entr.begin();
entityManager.persist(pro2);
entr.commit();
}
}
DeleteAction.java
EntityManager entityManager = EntityManagerUtil.getEmf()
.createEntityManager();
try {
EntityTransaction entr = entityManager.getTransaction();
entr.begin();
Project project = entityManager.find(Project.class,5);
entityManager.remove(project);
entr.commit();
}
例外是
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`prabha`.`project`, CONSTRAINT `FK_project_companyId` FOREIGN KEY (`companyId`) REFERENCES `company` (`id`))
Error Code: 1451
Call: DELETE FROM company WHERE (id = ?)
bind => [1 parameter bound]
Query: DeleteObjectQuery(com.demo.manytoone.Company@301db5ec)
从项目表中删除项目对象时,它抛出异常,我该如何克服这个问题。
【问题讨论】:
-
在 Project.java 中尝试删除“cascade=CascadeType.ALL”,当删除一个项目时,删除操作将传播到公司,如果公司有多个项目,删除将失败。
-
如果我删除了那个工作正常但插入时抛出异常
-
你能贴出插入的代码吗?
-
@Faton 我添加了插入代码检查一次
-
尝试先持久化comp2而不是添加到pro2,如果要将持久化形式pro2级联到comp2,请在Project中添加CascadeType.PERSIST或关注@Aditya解决方案。
标签: java jpa many-to-one