Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除子对象时的多对一关系&x27;s抛出异常_Java_Jpa_Many To One - Fatal编程技术网

Java 删除子对象时的多对一关系&x27;s抛出异常

Java 删除子对象时的多对一关系&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

我正在使用JPA进行多对一关系。从子表中删除子对象时,它引发异常

下面是我的代码:

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;
以下是插入代码:

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的关系”异常。非常感谢。