【问题标题】:Spring boot: error while saving entity with oneToMany relationSpring boot:使用 oneToMany 关系保存实体时出错
【发布时间】:2017-10-01 23:13:44
【问题描述】:

我有两个实体:categoryoneToMany products

那些有类:

Product.java

   @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "NAME")
    private Long NAME;

    @ManyToOne
    @JoinColumn(name="CATEGORY_ID", nullable = false)
    private Category category;

    //...getters, setters and toString

Category.java:

       @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;

        @Column(name = "NAME")
        private Long NAME;

        @OneToMany(cascade = CascadeType.ALL, mappedBy = "category", orphanRemoval = true)
        private List<Product> products;

        //...getters, setters and toString

CategoryBean 中,我拥有与Category 实体相同的字段。在ProductBean 之一中,我有与实体期望相同的category 字段(以避免映射时的无限循环)。

从前面(我使用角度),我发送与实体具有相同文件的类别对象。换句话说,我为了保存它而发送到后面的类别对象包含:name,和productsarray

为了保存类别,我正在这样做:

//from bean to entity
 Category category = CategoryMapper.toEntity(categoryBean);
 // NOTE: the category is containing the list of its products
 Category result = categoryRepository.save(category);
 return CategoryMapper.toBean(result);

但我收到了500 status,这是错误:

00:04:08.940 [http-nio-8080-exec-2] WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1747, SQLState: 42000
00:04:08.940 [http-nio-8080-exec-2] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-01747: invalid user.table.column, table.column, or column specification

00:04:09.276 [http-nio-8080-exec-2] WARN  ma.neoxia.exceptions.RestResponseEntityExceptionHandler - INTERNAL_SERVER_ERROR error 
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:261)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
    at 

请注意,我使用的是 oracleflyway。这是 PRODUCT SQL 脚本:

CREATE TABLE "PRODUCT"
   (  "ID" NUMBER(10,0),
  "NAME" VARCHAR2(255 CHAR),
  "CATEGORY_ID" NUMBER(10,0)
   );

CREATE UNIQUE INDEX "PRODUCT_ID_IDX" ON "PRODUCT" ("ID");

ALTER TABLE "PRODUCT" MODIFY ("ID" NOT NULL ENABLE);

ALTER TABLE "PRODUCT" ADD PRIMARY KEY ("ID");

ALTER TABLE "PRODUCT" MODIFY ("CATEGORY_ID" NOT NULL ENABLE);

这是我的类别SQL 脚本:

   CREATE TABLE "CATEGORY"
      ( "ID" NUMBER(19,0),
    "NAME" VARCHAR2(255 CHAR)
      );

  CREATE UNIQUE INDEX "CAT_ID_IDX" ON "CATEGORY" ("ID");

  ALTER TABLE "CATEGORY" MODIFY ("ID" NOT NULL ENABLE);

  ALTER TABLE "CATEGORY" ADD PRIMARY KEY ("ID");

【问题讨论】:

  • 假设错误与oneTomany 关系无关。堆栈跟踪抱怨invalid user.table.column。认为问题出在那儿。请分享涉及该操作的用户表和代码。

标签: java angularjs spring-boot spring-data-jpa flyway


【解决方案1】:

在您的 SQL 文件中,您错过了在 CATEGORY_ID 列上添加外键约束,其长度必须与 CATEGORY 表中的 ID 列相同

你可以这样做:

Alter TABLE PRODUCT
MODIFY "CATEGORY_ID" NUMBER(19,0);

ALTER TABLE PRODUCT
ADD CONSTRAINT FK_CategoryProduct
FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORY(ID);

【讨论】:

  • 所以问题出在 sql 脚本而不是 java 代码上?
  • @Llg 我没有看到与共享 Java 代码中显示的异常相关的问题
  • 很抱歉,迁移失败:SQL State : 22019 Error Code : 911 Message : ORA-00911: invalid character
  • 即使我在创建“Product”表时提到“CATEGORY_ID”是 NUMBER(10,0)?
  • 我测试了它,但我遇到了同样的问题
猜你喜欢
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多