JPA - 一对多合并问题

问题描述 投票:0回答:1

当我尝试合并一个实体时,我正面临下一个问题。

我有一个课程菜单(一对多) - >类别(一对多) - >商品关联。

如果我首先坚持使用空的列表类别和商品的菜单,菜单将被正确保留。

现在,如果我将当前保存菜单与一个类别合并并清空商品列表,则类别保存正常,即使我将新商品添加到空白商品列表中也可以保留。

现在,如果我在商品列表中添加第二个商品,我会遇到此错误:

菜单[menuId = 1,menu_name = dsad,menu_description = null,categories = [Category [category_id = 1,categoryName = a,goods = [GoodsImp [id = 1,brand = asd,createdDate = Mon Jan 22 18:26:35 ART 2018],price = 3.0,description = asd,type = product]],GoodsImp [id = null,brand = dsad,createdDate = null],price = 33333.0,description = sd,type = product]]]],Category [category_id = 2,categoryName = b,goods = []]],business = 2]

-------------- Hibernate:

/* load models.menu.Menu */ select
    menu0_.MENU_ID as MENU_ID1_7_1_,
    menu0_.BUSINESS_ID as BUSINESS2_7_1_,
    menu0_.MENU_DESCRIPTION as MENU_DES3_7_1_,
    menu0_.MENU_NAME as MENU_NAM4_7_1_,
    categories1_.Menu_MENU_ID as Menu_MEN1_8_3_,
    category2_.CATEGORY_ID as categori2_8_3_,
    category2_.CATEGORY_ID as CATEGORY1_2_0_,
    category2_.CATEGORY_NAME as CATEGORY2_2_0_
from
    MENUES menu0_
left outer join
    MENUES_CATEGORIES categories1_
        on menu0_.MENU_ID=categories1_.Menu_MENU_ID
left outer join
    Categories category2_
        on categories1_.categories_CATEGORY_ID=category2_.CATEGORY_ID
where
    menu0_.MENU_ID=? Hibernate:
/* load models.menu.Product */ select
    product0_.GOODS_ID as GOODS_ID2_6_0_,
    product0_.GOODS_BRAND as GOODS_BR3_6_0_,
    product0_.GOODS_CREATED as GOODS_CR4_6_0_,
    product0_.GOODS_DESCRIPTION as GOODS_DE5_6_0_,
    product0_.GOODS_IMAGE as GOODS_IM6_6_0_,
    product0_.GOODS_PRICE as GOODS_PR7_6_0_
from
    GOODS product0_
where
    product0_.GOODS_ID=?
    and product0_.DTYPE='PRODUCT'

休眠:

/* insert models.menu.Product
    */ insert
    into
        GOODS
        (GOODS_BRAND, GOODS_CREATED, GOODS_DESCRIPTION, GOODS_IMAGE, GOODS_PRICE, DTYPE)
    values
        (?, ?, ?, ?, ?, 'PRODUCT') Hibernate:
select
    goods0_.GOODS_ID as GOODS_ID2_6_0_,
    goods0_.GOODS_ID as GOODS_ID2_6_1_,
    goods0_.GOODS_BRAND as GOODS_BR3_6_1_,
    goods0_.GOODS_CREATED as GOODS_CR4_6_1_,
    goods0_.GOODS_DESCRIPTION as GOODS_DE5_6_1_,
    goods0_.GOODS_IMAGE as GOODS_IM6_6_1_,
    goods0_.GOODS_PRICE as GOODS_PR7_6_1_,
    goods0_.GOODS_PRICE_TYPE as GOODS_PR8_6_1_,
    goods0_.DTYPE as DTYPE1_6_1_
from
    GOODS goods0_
where
    goods0_.GOODS_ID=? Hibernate:
select
    goods0_.GOODS_ID as GOODS_ID2_6_0_,
    goods0_.GOODS_ID as GOODS_ID2_6_1_,
    goods0_.GOODS_BRAND as GOODS_BR3_6_1_,
    goods0_.GOODS_CREATED as GOODS_CR4_6_1_,
    goods0_.GOODS_DESCRIPTION as GOODS_DE5_6_1_,
    goods0_.GOODS_IMAGE as GOODS_IM6_6_1_,
    goods0_.GOODS_PRICE as GOODS_PR7_6_1_,
    goods0_.GOODS_PRICE_TYPE as GOODS_PR8_6_1_,
    goods0_.DTYPE as DTYPE1_6_1_
from
    GOODS goods0_
where
    goods0_.GOODS_ID=? Hibernate:



   /* update  models.menu.Product */ update
        GOODS
    set
        GOODS_BRAND=?,
        GOODS_CREATED=?,
        GOODS_DESCRIPTION=?,
        GOODS_IMAGE=?,
        GOODS_PRICE=?
    where
        GOODS_ID=? Hibernate:
/* create one-to-many row models.menu.Category.goods */ update
    GOODS
set
    GOODS_ID=?
where
    GOODS_ID=? [warn] o.h.e.j.s.SqlExceptionHelper - SQL Error: 1062, SQLState: 23000 [error] o.h.e.j.s.SqlExceptionHelper - Duplicate

键'PRIMARY'[错误]应用程序的条目'1' -

! @ 76lfn933p - 内部服务器错误,(PUT)[/ menu] - >

play.api.http.HttpErrorHandlerExceptions $$ anon $ 1:执行异常[[PersistenceException:org.hibernate.exception.ConstraintViolationException:无法执行语句]] at play.api.http.HttpErrorHandlerExceptions $ .throwableToUsefulException(HttpErrorHandler.scala:255) at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:182)at play.filters.cors.AbstractCORSPolicy $$ anonfun $ 1.applyOrElse(AbstractCORSPolicy.scala:155)at play.filters.cors.AbstractCORSPolicy $$ anonfun $ 1 .applyOrElse(AbstractCORSPolicy.scala:153)at scala.concurrent.Future。$ anonfun $ recoverWith $ 1(Future.scala:412)at scala.concurrent.impl.Promise。$ anonfun $ transformWith $ 1(Promise.scala:37)at at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)at play.api.libs.streams.Execution $ trampoline $ .execute(Execution.scala:70)at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise .scala:68)at scala.concurrent.impl.Promise $ DefaultPromise。$ anonfun $ tryComplete $ 1(Promise.scala:284)Caus编辑:javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException:无法在org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl)的org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149)中执行语句.java:157)在org.hibernate.internal.SessionImpl.flush上的org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1443) SessionImpl.java:1423)at repository.dPAMenuesRepository.lambda $ updateMenu $ 2(JPAMenuesRepository.java:46)at play.db.jpa.DefaultJPAApi.lambda $ withTransaction $ 3(DefaultJPAApi.java:197)at play.db.jpa.DefaultJPAApi .withTransaction(DefaultJPAApi.java:138)at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:196)at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:169)引起:org.hibernate。 exception.ConstraintViolationException:无法在o处执行语句位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper的org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)中的rg.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)。转换(sqlExceptionHelper.java:111)atg.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)在org.hibernate.perst.Bot中的org.hibernate.engz.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)org.hibernate.persister.colsert.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1567) .OneToManyPersister.insertRows(OneToManyPersister.java:193)org.hibernate.action.CollectionUpdateAction.exe执行(CollectionUpdateAction.java:85)org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:589)通过:com.mysql.jdbc .exceptions.jdbc4.MySQLIntegrityConstraintViolationException:sun.reflect.DelegatingConstructorAccessorImpl.newInstance(在sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源))sun.reflect.NativeConstructorAccessorImpl.newInstance0(本地方法)中的键'PRIMARY'复制条目'1'源自com.mysql.jdbc.Util.handleNewInstance(Util.java:425)的java.lang.reflect.Constructor.newInstance(Unknown Source)at com.mysql.jdbc.Util.getInstance(Util.java:408) )com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java: 3909)在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)

java mysql hibernate jpa
1个回答
0
投票

我可以解决它。

问题是,One to Many的关系有@JoinColumn而不是@JoinTable。你编写几个小时的问题就是这个问题,你只是看不出明显的问题。

谢谢大家。

© www.soinside.com 2019 - 2024. All rights reserved.