2017-02-28 75 views
0

我有2个实体有一对多的关系。由于外键为空,相关子条目无法插入。 虽然在测试中工作。春季数据百里香 - 无法插入相关记录,外键空

看上去很高,大部分都被解决了,因为提问者并没有把孩子添加到父母身上,这不是我的情况。任何帮助感谢!

错误

Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("AIWA"."CAT_DT"."CAT_ID")

编辑1:添加详细的错误日志如下。

2017-03-01 09:45:04 DEBUG JpaTransactionManager:759 - Initiating transaction commit 2017-03-01 09:45:04 DEBUG JpaTransactionManager:512 - Committing JPA transaction on EntityManager [[email protected]] 2017-03-01 09:45:04 DEBUG SQL:109 - insert into CAT (CATTYPE, ..., ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?) 2017-03-01 09:45:04 TRACE BasicBinder:81 - binding parameter [1] as [NUMERIC] - [200] 2017-03-01 09:45:04 TRACE BasicBinder:69 - binding parameter [2] as [VARCHAR] - [null] 2017-03-01 09:45:04 TRACE BasicBinder:81 - binding parameter [3] as [VARCHAR] - [1] 2017-03-01 09:45:04 TRACE BasicBinder:69 - binding parameter [4] as [VARCHAR] - [null] 2017-03-01 09:45:04 TRACE BasicBinder:69 - binding parameter [5] as [VARCHAR] - [null] 2017-03-01 09:45:04 TRACE BasicBinder:69 - binding parameter [6] as [VARCHAR] - [null] 2017-03-01 09:45:04 TRACE BasicBinder:81 - binding parameter [7] as [NUMERIC] - [1] 2017-03-01 09:45:04 TRACE BasicBinder:69 - binding parameter [8] as [VARCHAR] - [null] 2017-03-01 09:45:04 TRACE BasicBinder:81 - binding parameter [9] as [NUMERIC] - [182] 2017-03-01 09:45:04 DEBUG SQL:109 - insert into CAT_DT (CAT_ID, DESCR, LANGUAGE, NAME, SORTNAME, ID) values (?, ?, ?, ?, ?, ?) 2017-03-01 09:45:04 TRACE BasicBinder:69 - binding parameter [1] as [NUMERIC] - [null] 2017-03-01 09:45:04 TRACE BasicBinder:81 - binding parameter [2] as [VARCHAR] - [a] 2017-03-01 09:45:04 TRACE BasicBinder:81 - binding parameter [3] as [NUMERIC] - [1] 2017-03-01 09:45:04 TRACE BasicBinder:81 - binding parameter [4] as [VARCHAR] - [a] 2017-03-01 09:45:04 TRACE BasicBinder:69 - binding parameter [5] as [VARCHAR] - [null] 2017-03-01 09:45:04 TRACE BasicBinder:81 - binding parameter [6] as [NUMERIC] - [264] 2017-03-01 09:45:04 WARN SqlExceptionHelper:144 - SQL Error: 1400, SQLState: 23000 2017-03-01 09:45:04 ERROR SqlExceptionHelper:146 - ORA-01400: cannot insert NULL into ("CAT_DT"."CAT_ID")

2017-03-01 09:45:04 INFO AbstractBatchImpl:208 - HHH000010: On release of batch it still contained JDBC statements 2017-03-01 09:45:04 DEBUG JpaTransactionManager:898 - Initiating transaction rollback after commit exception

实体

public class Cat{ 
    private List<CatDt> catDts = new ArrayList<CatDt>(); 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "cat", cascade=CascadeType.ALL) 
    public List<CatDt> getCatDts() { 
     if(this.catDts==null){ 
      this.catDts = new ArrayList<CatDt>(); 
     } 
     return this.catDts; 
    } 

    public void setCatDts(List<CatDt> catDts) { 
     this.catDts = catDts; 
    } 
} 

public class CatDt{ 
    private Cat cat; 

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) 
    @JoinColumn(name = "CAT_ID", nullable = false) 
    public Cat getCat() { 
     return this.cat; 
    } 

    public void setCat(Cat cat) { 
     this.cat = cat; 
    } 
} 

Thymeleaf形式

<ul th:each="item, stat: *{catDts}"> 
    <li> 
     <span th:text="#{front.cat.CatDt.no.label}">No</span> 
     <label th:text="${stat.count}">1</label> 
    </li> 
    <li> 
     <span th:text="#{front.cat.CatDt.name.label}">Name</span> 
     <input type="text" th:field="*{catDts[__${stat.index}__].name}" th:id="${'name-'+stat.index}"> 
    </li> 
    <li> 
     <span th:text="#{front.cat.CatDt.descr.label}">Description</span> 
     <input type="text" th:field="*{catDts[__${stat.index}__].descr}" th:id="${'descr-'+stat.index}"> 
    </li> 
    <li> 
     <span th:text="#{front.cat.CatDt.lang.label}">Language</span> 
     <input type="text" th:field="*{catDts[__${stat.index}__].language}" th:id="${'language-'+stat.index}"> 
    </li>  
</ul> 

产生的HTML表格

<form action="/aiwaweb/cat/create" method="post"> 
    <!-- Main info --> 
    <ul> 
     <li> 
      <span>Code</span> 
      <input id="code" name="code" value="" type="text">   
     </li> 
     <li> 
      <span>Type</span> 
      <select id="catType" name="catType"> 
       <option...>...</option> 
      </select> 
     </li> 
     <li> 
      <span>Status</span> 
      <select id="status" name="status"> 
       <option value="0">INACTIVE</option> 
       <option value="1">ACTIVE</option> 
      </select> 
     </li>   
    </ul> 

    <!-- Details -->  
    <ul> 
     <li> 
      <span>No.</span> 
      <label>1</label> 
     </li> 
     <li> 
      <span>Name</span> 
      <input id="name-0" name="catDts[0].name" value="" type="text"> 
     </li> 
     <li> 
      <span>Description</span> 
      <input id="descr-0" name="catDts[0].descr" value="" type="text"> 
     </li> 
     <li> 
      <span>Language</span> 
      <input id="language-0" name="catDts[0].language" value="" type="text"> 
     </li> 
    </ul> 
</form> 

编辑2更新后的控制器create()将Cat添加到CatDt(早些时候它只是将CatDt添加到Cat);希望这种2种方式的关系可以解决,但没有。

控制器

@GetMapping({"/create"}) 
public String create(ModelMap model){ 
    Cat cat = new Cat(); 
    List<CatDt> catDts = new ArrayList<CatDt>(); 
    CatDt catDt = new CatDt(); 
    catDt.setCat(cat); //this is the extra line added 
    catDts.add(catDt); 
    cat.setCatDts(catDts); 
    model.addAttribute("cat", cat); 
    return "cat/create"; 
} 

@PostMapping(value="/create", params={"save"}) 
public String save(final Cat cat 
     , final BindingResult bindingResult, final ModelMap model){ 
    if(bindingResult.hasErrors()){ 
     return "cat/create"; 
    } 
    Cat updatedCat = catService.save(cat); 
    model.clear(); 
    return "redirect:/cat/create"; 
} 

我做了什么至今

  1. 当调试我控制器保存()上,猫有孩子CatDt在列表中,但猫财产CatDt的值为null;但是想一想,也许它应该是空的,因为猫还没有保存,所以没有身份证。

单元测试

@Test 
public void testCatSave(){ 
    Cat cat = new Cat(); 
    cat.setCode("11111"); 
    ...  
    //add cat details 
    List<CatDt> catDts = new ArrayList<CatDt>();   
    CatDt catDt = new CatDt(); 
    catDt.setCat(cat); 
    catDt.setName("Test"); 
    ... 
    catDts.add(catDt); 
    cat.setCatDts(catDts);   
    Cat catUpdated = catService.save(cat); 
} 

持久性配置

public class PersistenceConfig { 
    @Autowired 
    private Environment env; 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() 
    { 
     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setDataSource(dataSource()); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setJpaProperties(hibernateProperties()); 
     factory.setPackagesToScan("ae.tbits.atn.aiwacore.common.model"); 
     return factory; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) 
    { 
     JpaTransactionManager txManager = new JpaTransactionManager(); 
     txManager.setEntityManagerFactory(emf); 
     return txManager; 
    } 

    @Bean 
    public HibernateExceptionTranslator hibernateExceptionTranslator(){ 
     return new HibernateExceptionTranslator(); 
    } 

    @Bean 
    public DataSource dataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); 
     dataSource.setUrl(env.getProperty("jdbc.url")); 
     dataSource.setUsername(env.getProperty("jdbc.username")); 
     dataSource.setPassword(env.getProperty("jdbc.password")); 
     return dataSource; 
    } 

    private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", env.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", env.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", env.getRequiredProperty("hibernate.format_sql")); 
env.getRequiredProperty("hibernate.type")); 
     return properties;   
    }  
} 

在此之后,以一个T,但不保存子记录http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#the-controller

+0

添加编辑1显示更多的日志。可以看到父母和孩子的2组插入语句。不知何故_child没有获得新插入的父id_。我是否需要手动执行任何操作,例如_commit_或_flush_?如果是的话,因为我尝试了,我的mvc代码抛出错误(_no transaction in progress_)。我的服务只是调用repo的Cat.save();测试运行良好。还是需要修改实体或配置? –

回答

0

好了,所以最后我能解决。结果不知怎么,孩子们的猫没有被添加到猫对象中。

在控制器保存()我手动重新分配,并保存。

public String save(final Cat cat 
     , final BindingResult bindingResult, final ModelMap model){ 
    if(bindingResult.hasErrors()){ 
     logger.info("Binding result error in create(save)"); 
     return "cat/create"; 
    } 
    //manually reassign - start 
    List<CatDt> catDts = cat.getCatDts(); 
    for (CatDt catDt : catDts) { 
     catDt.setCat(cat); 
    } 
    cat.setCatDts(catDts); 
    //manually reassign - end 

    Cat updatedCat = catService.save(cat); //saveAndFlush 
    model.clear(); 
    return "redirect:/cat/create"; 

} 

虽然这个工作,我想,不知我的thymeleaf形式设置不正确,因此它没有连接,所以欢迎任何人在解释扔。

谢谢。