【问题标题】:JPA - One to many merge issueJPA - 一对多合并问题
【发布时间】:2018-07-01 15:15:20
【问题描述】:

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

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

如果我首先保留具有空的类别和商品列表的菜单,则菜单将正确保留。

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

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

菜单 [menuId=1, menu_name=dsad, menu_description=null, 类别=[类别[category_id=1,categoryName=a,货物=[GoodsImp [id=1,brand=asd,createdDate=Mon Jan 22 18:26:35 ART 2018],价格 =3.0, description=asd, type= product]], GoodsImp [id=null, brand=dsad, createdDate=null], price=33333.0, description=sd, type= product] ]]],类别 [category_id=2,categoryName=b,goods=[ ]]], 业务=2]

------------- 休眠:

/* 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:执行 异常[[持久性异常: org.hibernate.exception.ConstraintViolationException:不能 执行语句]] 在 play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:255) 在 play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:182) 在 play.filters.cors.AbstractCORSPolicy$$anonfun$1.applyOrElse(AbstractCORSPolicy.scala:155) 在 play.filters.cors.AbstractCORSPolicy$$anonfun$1.applyOrElse(AbstractCORSPolicy.scala:153) 在 scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:412) 在 scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37) 在 scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60) 在 play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70) 在 scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68) 在 scala.concurrent.impl.Promise$DefaultPromise.$anonfun$tryComplete$1(Promise.scala:284) 引起:javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException:不能 执行语句 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149) 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157) 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164) 在 org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1443) 在 org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1423) 在 repository.JPAMenuesRepository.lambda$updateMenu$2(JPAMenuesRepository.java:46) 在 play.db.jpa.DefaultJPAApi.lambda$withTransaction$3(DefaultJPAApi.java:197) 在 play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:138) 在 play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:196) 在 play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:169) 引起:org.hibernate.exception.ConstraintViolationException:可以 不执行语句 在 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178) 在 org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) 在 org.hibernate.persister.collection.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1567) 在 org.hibernate.persister.collection.OneToManyPersister.insertRows(OneToManyPersister.java:193) 在 org.hibernate.action.internal.CollectionUpdateAction.execute(CollectionUpdateAction.java:85) 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:589) 造成的: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 键“P​​RIMARY”的重复条目“1” 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知 资源) 在 java.lang.reflect.Constructor.newInstance(未知来源) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:425) 在 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)

【问题讨论】:

  • MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY' 您需要确保第二个对象不重复。标识符的生成方式是什么?
  • 商品对象通过Identity生成类型生成ID:@Id @GeneratedValue(strategy = GenerationType.IDENTITY)

标签: java mysql hibernate jpa


【解决方案1】:

我可以解决它。

问题是,一对多关系有一个@JoinColumn 而不是@JoinTable。这就是你编码几个小时的问题,你只是看不到明显的问题。

谢谢大家。

【讨论】:

  • 一个很好的练习是尝试在一个问题中发布所有核心代码。通常,您会在编写问题时发现错误。而且您无需创建问题
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
相关资源
最近更新 更多