在一个项目中,我有以下实体:具有连接到关键字的模板部分的模板。这两种关系都是@ManyToMore
。一些代码:
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "TEMPLATE")
public class TemplateEntity extends SystemFlagEntity {
...
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "TEMPLATEPART_CATALOGUE",
joinColumns = @JoinColumn(name = "C_FK_TEMPLATE", referencedColumnName = "C_I_IDF"),
inverseJoinColumns = @JoinColumn(name = "C_FK_TEMPLATEPART", referencedColumnName = "C_I_IDF"))
Set<TemplatePartEntity> templatePartsCatalogue = new HashSet<>();
}
@ToString
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "TEMPLATEPART")
public class TemplatePartEntity extends SystemFlagEntity {
...
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "TEMPLATEPART_KEYWORD",
joinColumns = @JoinColumn(name = "C_FK_TEMPLATEPART"),
inverseJoinColumns = @JoinColumn(name = "C_FK_KEYWORD"))
Set<KeywordEntity> keywords = new HashSet<>();
}
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "KEYWORD")
public class KeywordEntity extends LabeledEntity {
...
}
然后,我尝试使用给定ID查找与某个模板相关的关键字。我使用QueryDSL
使用此谓词执行此操作:
public Iterable<KeywordEntity> findCatalogueKeywordsForTemplate(Long id) {
return findAll(
QKeywordEntity.keywordEntity.in(QTemplateEntity.templateEntity.templatePartsCatalogue.any().keywords)
.and(QTemplateEntity.templateEntity.id.eq(id))
);
}
由于某些原因,谓词处理得根本不好。尝试调用方法时出现此错误:
组织.hibernate.hql.internal.ast.QuerySyntax 异常: 模板实体部分目录未映射 [选择关键字身份\nfrom mypackage.core.domain.model.关键字实体\n存在(选择 1\nfrom 模板实体模板部分类别为templateEntity_templatePartsCatalogue_0\nwhere 关键字templateEntity_templatePartsCatalogue_0.关键字的实体成员)和 templateEntity.id = ?1];嵌套的异常是 java.lang.非法描述异常:组织.Hibernate.hql.internal.ast.QuerySyntax异常: 模板实体.模板部分未映射类别 [选择关键字身份\nf来自 mypackage.core.domain.model.关键字身份关键字存在(选择 1\nf从模板中选择 1\nf从模板中输入内容模板templateEntity_templatePartsCatalogue_0\nwhere 关键字templateEntity_templatePartsCatalogue_0.关键字)和 templateEntity.id = ?1]
看起来它没有很好地处理@ManyToMany
关联。关于如何解决这个问题的任何想法?我知道我可以显式使用 JPAQuery
,但我想改用谓词
。
在看到< code>QueryDSL的创建者的回答后,我发现我误解了谓词的工作方式。这个查询不需要显式定义多对多关联表:
public Iterable<KeywordEntity> findCatalogueKeywordsForTemplate(Long id) {
return new JPAQuery<>(entityManager)
.select(QKeywordEntity.keywordEntity)
.from(QTemplateEntity.templateEntity)
.innerJoin(QTemplateEntity.templateEntity.templatePartsCatalogue, QTemplatePartEntity.templatePartEntity)
.innerJoin(QTemplatePartEntity.templatePartEntity.keywords, QKeywordEntity.keywordEntity)
.where(interceptPredicate(QTemplateEntity.templateEntity.id.eq(id)))
.distinct()
.fetch();
}
问题内容: 我有一些与关系有关的实体: 和 使用某些模型执行保存模型时,一切正常。表存储这些实体的所有键。但是,使用驱动程序保存模型时,表不会更改。我认为映射存在问题。 问题答案: 那是预期的行为。在双向多对多关联中,一侧必须是反侧。在您的情况下,这是一面,因为它包含: 拥有关系的字段。除非关系是单向的,否则为必需。 这意味着是关联的所有者,并且Hibernate仅在维护关联时检查该侧。
我试图存储一个manytomany关系,但它没有存储关系。 下面的代码生成了3个表。 这是我发送到服务器的JSON: {“abbreviatedsequence”:“xdf”,“medals”:[{“name”:“purple”,“id”:1},{“name”:“red”,“id”:2}],“sequence”:“xdfree”,“name”:“savier”} java
它附加在单向@manytomany上,如下所示: 当joinColumns由主键组成时(hibernate只记录它的id),所以我认为问题是由我的JoinTable中有非主列引起的(而hibernate试图记录整个对象)。 这是一个bug还是禁止有这样的连接? toString methodz中没有错误。我敢肯定。首先,我们可以在堆栈中,在递归调用之间没有任何中间,其他hibernate。toSt
我想在(您可以将其视为Student)实体和实体之间实现一个@ManyTomany单向的。很简单,一个教室可以有很多学生,而学生可以有很多教室。我希望它是单向的,因为我希望班级只知道它包含什么学生,学生不必知道他们有什么班级。这就是我目前所拥有的: ClassRoom.java Account.java 我通过以下代码保存它(使用Spring JPA): 但我得到了以下错误: 下面是StackTr
我有两个实体,用户和电影。他们是很多双向的关系。我的问题是,当我通过我的控制器删除一部电影时,它也会删除所有与该电影相关的实体。My user和this user角色和movie实体。我要做什么,从表中删除电影实体,并保持用户与他的角色,而不是删除他们所有。
我正在尝试链接mysql表(role、user、user_role)。 UserModel实体包含字段“roles”。 当我保存用户时,表'roles'中会自动创建新行。如何取消重复角色?