Java 休眠多对多单向,无重复

Java 休眠多对多单向,无重复,java,hibernate,duplicates,many-to-many,Java,Hibernate,Duplicates,Many To Many,是否可以在hibernate中使用单向多对多映射,从而不保存子级的副本?我使用的是XML映射,而不是注释,因为这正是我刚开始使用的 我只发现这是一个潜在的解决方案,但我想知道hibernate是否可以在不编码的情况下进行配置: 在我的例子中,我使用jaxb对XML进行解组以获取java对象,并且不需要双向映射 我有一个类ArticleItem,它有一组Category,Category类没有对文章的引用。 我要做的是保存article对象,并且仅在类别不存在的情况下将类别插入到Category

是否可以在hibernate中使用单向多对多映射,从而不保存子级的副本?我使用的是XML映射,而不是注释,因为这正是我刚开始使用的

我只发现这是一个潜在的解决方案,但我想知道hibernate是否可以在不编码的情况下进行配置:

在我的例子中,我使用jaxb对XML进行解组以获取java对象,并且不需要双向映射

我有一个类ArticleItem,它有一组Category,Category类没有对文章的引用。 我要做的是保存article对象,并且仅在类别不存在的情况下将类别插入到Category表中。类别链接到文章的方式是通过链接表实现的

我想让它在没有编码的情况下工作的原因是我想学习一些新的hibernate。也许我对Hibernate的理解是错误的,我认为如果我配置正确,它可以知道它需要做什么。 到目前为止,我已经花了将近一天的时间学习hibernate,考虑到我可以自己设计db表,并在一小时内完成正确插入/更新的代码,我觉得它不是很有成效

这是一个类似于我的例子,他们节省了2名学生,他们都有相同的课程。但是,课程在课程表中仅保存一次:

这里还有一个例子,但它是双向的,我不能以同样的方式进行反向映射,因为该类别没有对文章的引用: 顺便说一句,病毒帕特尔有非常好的教程=

Article has properties:
String Title;
Set<Category> categories;

Category has property:
String category;
到目前为止,在ItemArticle映射中,我有以下内容:

<set name="categories" cascade="save-update" table="ItemCategory"> 
   <key column="itemID"/>
   <many-to-many column="categoryID" class="Category"/>
</set>   
它几乎像我希望的那样工作,只是它确实在Category表中多次保存相同的类别,这似乎是不必要的

我主要希望使用Hibernate来避免设计表,并轻松地将RSS对象转储到nosql数据库之类的结构化格式中

更新: 重复项来自于添加的其他项目和项目具有类别表中已存在的相同类别。 第一项分为经济和政治两类 第二篇文章讲的是经济

保存第二个项目时,我希望hibernate将联接表中的一个条目添加到现有的经济行中,而不是创建一个新条目

我已经尝试使该类别唯一,但后来从hibernate得到sql错误,该索引已经包含该键

更新2: 我将Item类更改为具有一组字符串,而不是类别。 映射现在看起来像:

<set name="categories" table="Category">
    <key column="itemID"/>
    <element column="category" type="string"/>
</set>  
这将删除我希望避免数据重复的连接表。现在,类别或标记出现在类别表中的次数与它们在所有项目和文章中出现的次数相同

整个想法是在存储1000个项目时减少数据库中的数据。通常使用相同的类别或标记,因此如果联接表的使用方式使类别表只包含唯一的类别,则可以删除大量冗余

更新3: 我的问题似乎与此类似:

更新4: 我切换回在Item类中有一组类别,通过使用Category.Category作为键来测试它是否有效。 项目的映射:

<set name="categories" cascade="save-update" table="ItemCategory"> 
   <key column="itemID"/>
   <many-to-many column="category" class="Category"/>
</set>     
类别的映射:

<id column="category" name="category" unsaved-value="0">
  <generator class="assigned"/>
</id> 
结果是我得到了异常:
org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联

,因此,如果您的类别只有一个属性,则可以执行以下操作:

@Id private String category;
你也可以在JPA中使用

@ElementCollection private Set<String> categories;
对于集合中的重复子项:

在Java中,一个集合不能有重复项

您可以覆盖类别实体的equals/hashcode。但是要小心,在重写之前必须检查JPA规范

您可以使用“选择”搜索类别并尝试添加它。类别实体将位于持久性上下文中,因此它在集合中具有相同的指针。如果未找到,请创建新类别


我在xml映射中找不到元素集合,我发现了这个问题:我使用set创建它,在Item类中,我将类别集缩减为字符串集。这是我唯一能避免的问题。我想知道是否可以使用连接表,这样我就不会重复类别表中的类别,以供将来参考。例如,仅当类别不存在时插入。如果您的ID是您的类别,则不能有重复项。ElementCollection是JPA。我猜你和hibernate有类似的关系。