来自不为父子工作的实体的JPAControllers创建

时间:2013-12-19 13:12:01

标签: java mysql jpa netbeans eclipselink

我有父母和子女表。

schema: parent(int id,varchar desc), child(int id, varchar desc, int parent_id(foreignKey)).

从此我创建了实体,然后使用netbeans从那些实体创建了JPAControllers。 当我尝试使用子集合存储父节点时,它会抛出java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation.。在检查了netbeans生成的JPA控制器之后,我发现他们假设父对象中的子对象有ID,而在我的情况下,因为子对象也是新的,我没有它们的ID。但我不明白的是为什么netbeans生成的JPAController代码中存在以下代码。

Collection<Child> attachedChildCollection = new ArrayList<Child>();
for (Child childCollectionChildToAttach : parent.getChildCollection()) {
    childCollectionChildToAttach = em.getReference(childCollectionChildToAttach.getClass(), childCollectionChildToAttach.getId());
    attachedChildCollection.add(childCollectionChildToAttach);
}
parent.setChildCollection(attachedChildCollection);

除了手动编辑JPAControllers外,是否有人知道解决此问题的任何方法。

下面的代码段显示了我是如何尝试存储父级的。

Parent parentObj = new Parent();
parentObj.setDesc("parent");
Collection<Child> childCollection = new ArrayList<>();
Child childObj = new Child();
childObj.setDesc("child1");
childCollection.add(childObj);
Child childObj2 = new Child();
childCollection.add("childObj2");
parentObj.setChildCollection(childCollection);
parentJpaController.create(parentObj);

创建表格的脚本

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`PARENT`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`PARENT` (
  `ID` INT NOT NULL AUTO_INCREMENT ,
  `DESC` VARCHAR(45) NULL ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`CHILD`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`CHILD` (
  `ID` INT NOT NULL AUTO_INCREMENT ,
  `DESC` VARCHAR(45) NULL ,
  `PARENT` INT NOT NULL ,
  PRIMARY KEY (`ID`) ,
  INDEX `FK_CHILD_PARENT` (`PARENT` ASC) ,
  CONSTRAINT `FK_CHILD_PARENT`
    FOREIGN KEY (`PARENT` )
    REFERENCES `mydb`.`PARENT` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

0 个答案:

没有答案