当前位置: 首页 > 知识库问答 >
问题:

Hibernate保存到db“键'UK_2N5XTTSXWBYC6X67L0X8PHFWN'的重复项'1'”

公良征
2023-03-14

我有一个recipe.java对象,里面有@entity:

...  
@OneToMany(cascade = CascadeType.ALL)
private List<Category> category;  
...  

然后是带有@Entity的category.java对象:

...  
@OneToOne(cascade = CascadeType.ALL)  
private Name name;  
...

假设db如下所示(recipe_category表):

...
        Recipe recipe = recipeRepository.findOne(recipeId);
        Category ctg = categoryRepository.findOne(categoryId); // id=1

        List<Category> categories = recipe.getCategory();
        categories.add(ctg);
        recipe.setCategory(categories);

        recipeRepository.save(recipe);
...
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'UK_2n5xttsxwbyc6x67l0x8phfwn'

共有1个答案

宗冠宇
2023-03-14

你们的关系不是一对多。您希望每个食谱都有多个类别。我想你也希望每个类别与多个食谱相关联。这是一种多对多的关系。您需要使用@manytomany注释来配置实体。

还要注意,Hibernate关系总是单向的。当将@manytomany注释放入recipe类中时,可以访问与给定食谱关联的类别。为了访问反向关系,要获得给定类别的菜谱,还需要向category类添加一个具有@manytomany注释的适当属性。

我想您使用了hbm2ddl或类似的方法来自动创建表,由于表是为一对多关系创建的,因此会出现错误。更具体地说,在单向一对多关系中,联接表(recipe_category表中的category_id)中的反外键列定义了唯一约束。因此,使用该表模式,您不能将一个类别与一个以上的食谱相关联。

// Recipe
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="category_map", )
private List<Category> categories = new ArrayList<> ();
// Category
@ManyToMany(cascade=CascadeType.ALL, mappedBy="categories")     
private Set<Recipe> recipes;    
 类似资料:
  • 我有上面的错误。 首先,我试图完全理解它的意思。 下面是抛出错误的语句。

  • 从这里开始,根据RDD/Spark DataFrame中的特定列从行中删除重复项,我们学习了如何根据一些特定变量删除重复的观察。如果我想以RDD的形式保存这些重复的观察结果,我该怎么做?我想如果RDD包含数十亿个观察值可能效率不高。那么除了使用之外,还有其他方法吗?

  • 我有一个简单的Spring启动应用程序,它带有一个enpoint,通过JobLauncher bean中配置的SimpleAsynctaskeExecutor异步调用Spring批处理作业。 Spring批处理作业异步启动,工作正常,但没有任何内容保存到数据库中。 如果我删除SimpleAsyncTaskExecutor,数据就会保存。 这是我的批处理配置程序。我用SimpleAsyncTaskE

  • 我在使用复合主键创建实体时遇到问题,该键也是外键。这是我的表和关系表原理图。当我想创建新闻实体时,我收到了带有null creatingnews的错误消息。新闻翻译有复合主键,外键引用到新闻表。 这是我的代码: 新闻聚合 新闻翻译 标签 新闻语言ID 在NewsFactory中,我希望使用NewsTranslation创建NewsAggregate,但有错误消息NullPointer。 新闻工厂

  • 我购买了一张桌子,DDL为: Purchase表与purchaseproduct有一对多关系,purchaseproduct的DDL为: 以下是我的POJO: 购买:@Entity@Table(name=“Purchase”)@Access(AccessType.Property)公共类购买{private LongProperty IDPurchase;private StringPropert

  • 我的数据库中有这些(简化的)表 我已经用这两个(简化的)类映射了表 公司 如果我注释第26、28、30和32行(上面标记的),同样的代码可以完美地工作。但我想知道为什么会产生异常。为什么是复制的钥匙? 提前谢了。