Java 删除子对象时的多对一关系&x27;s抛出异常
我正在使用JPA进行多对一关系。从子表中删除子对象时,它引发异常 下面是我的代码: Project.javaJava 删除子对象时的多对一关系&x27;s抛出异常,java,jpa,many-to-one,Java,Jpa,Many To One,我正在使用JPA进行多对一关系。从子表中删除子对象时,它引发异常 下面是我的代码: Project.java @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name="projectName") private String projectName; @Column(name="projectDesc") privat
@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")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="projectName")
private String projectName;
@Column(name="projectDesc")
private String projectDesc;
@ManyToOne
@JoinColumn(name="companyId")
private Company company;
Company.java
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="compName")
private String compName;
@Column(name="address")
private String address;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="compName")
private String compName;
@Column(name="address")
private String address;
@OneToMany(mappedBy="company", fetch=FetchType.EAGER)
private List<Project> projects;
以下是插入代码:
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();
}
}
EntityManager entityManager = EntityManagerUtil.getEmf()
.createEntityManager();
try {
EntityTransaction entr = entityManager.getTransaction();
entr.begin();
Project project = entityManager.find(Project.class,5);
entityManager.remove(project);
entr.commit();
}
DeleteAction.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();
}
}
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)
当从项目表中删除项目对象时,它引发了上述异常,我如何才能解决这个问题
您不应使用CascadeType.ALL,请尝试使用CascadeType.MERGE
CascadeType.ALL的含义是持久化将把所有EntityManager操作(持久化、删除、刷新、合并、分离)传播(级联)到相关实体
在您的情况下,这似乎是一个坏主意,因为当您使用CAscadeType.ALL时,删除项目将导致删除相关的公司。由于公司
可以有多个项目
,其他项目
将成为孤儿。然而,相反的情况(删除公司
)是有意义的-如果删除该公司,则可以安全地传播属于公司
的所有项目
的删除
您还可以使用各种级联类型,例如。
cascade={CascadeType.PERSIST,CascadeType.MERGE}。
所以,使用所有适用于你的方法
更多
以上代码将解决您的问题。如果您观察注释manytone的源代码,它有一个级联类型的数组,因此您可以映射多个级联类型您得到了MySQLIntegrityConstraintViolationException。这意味着要绑定的数据库中存在表。您应该在设置多对一关系表时进行映射。公司应该能够获得多个项目。因此,您必须定义项目列表
Project.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")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="projectName")
private String projectName;
@Column(name="projectDesc")
private String projectDesc;
@ManyToOne
@JoinColumn(name="companyId")
private Company company;
Company.java
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="compName")
private String compName;
@Column(name="address")
private String address;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="compName")
private String compName;
@Column(name="address")
private String address;
@OneToMany(mappedBy="company", fetch=FetchType.EAGER)
private List<Project> projects;
@Id
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int-id;
@列(name=“compName”)
私有字符串compName;
@列(name=“address”)
私有字符串地址;
@OneToMany(mappedBy=“company”,fetch=FetchType.EAGER)
私人清单项目;
在Project.java中尝试删除“cascade=CascadeType.ALL”,删除项目时,删除操作将传播到公司,如果公司有多个项目,则删除将失败。如果我删除了该项目,效果良好,但在插入时引发异常,您可以发布执行插入的代码吗?@Faton我添加了插入代码,请再次检查它以保留第一个comp2,而不是将其添加到pro2,如果您要将保留表单pro2级联到comp2,在项目中添加CascadeType.PERSIST或follow@Aditya solution。我添加了一条项目记录被删除,但在插入时抛出了“未标记为cascade PERSIST的关系”异常。非常感谢。