我有一个实体:HtmlElement
,与实体:@OneToOne
的关系Component
以下
QueryParameter实体:
@Id
@Column(name = "QUERY_PARAMETER_ID")
private int queryParameterId;
@Column(name = "QUERY_PARAMETER")
private String queryParameter;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "QUERY_ID")
private Query Query;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "HTML_ELEMENT_ID")
private HtmlElement HtmlElement;
HtmlElement实体:
@Id
@Column(name = "HTML_ELEMENT_ID")
private int htmlElementId;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "COMPONENT_ID")
private Component Component;
@Column(name = "HTML_ELEMENT_ID_NAME")
private String htmlElementIdName;
@Column(name = "HTML_ELEMENT_SHOWING_NAME")
private String htmlElementShowingName;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "TYPE_ID")
private Type Type;
@Column(name = "HTML_ELEMENT_MAXLENGTH")
private String htmlElementMaxlength;
@Column(name = "HTML_ELEMENT_PLACEHOLDER")
private String htmlElementPlaceholder;
@Column(name = "HTML_ELEMENT_HELPTEXT")
private String htmlElementHelptext;
@OneToOne(mappedBy = "HtmlElement")
private QueryParameter QueryParameter;
组件实体:
@Id
@Column(name = "COMPONENT_ID")
private int componentId;
private String component;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
schema = "APP_OWNER",
name = "_COMPONENT_TYPE",
joinColumns = { @JoinColumn(name = "COMPONENT_ID") },
inverseJoinColumns = { @JoinColumn(name = "TYPE_ID") }
)
@OrderBy("TYPE_NAME")
private Set<Type> Types = new HashSet<>();
@OneToOne(mappedBy = "Component")
private HtmlElement HtmlElement;
类型实体:
@Id
@Column(name = "TYPE_ID")
private int typeId;
@Column(name = "TYPE_NAME")
private String typeName;
@ManyToMany(mappedBy = "Types")
private Set<Component> Components = new HashSet<>();
@OneToOne(mappedBy = "Type")
private HtmlElement HtmlElement;
基本上,这里的关系意味着一个html元素具有一个与其相关的组件。
现在,当我想查找如下所有组件时:
List<Component> componentList = componentRepo.findAllByOrderByComponentIdAsc();
它给我以下错误:
More than one row with the given identifier was found: 3
如果我运行生成的查询,它将返回3行,但这没有任何意义,因为Component具有不同的html组件(输入,选择等),并且HtmlElement正在使用组件ID以及与此相关的更多信息,这非常完美可以在不同的HtmlElements中重复使用相同的组件ID。
我尝试按照here中的建议级联所有对象并删除孤立的对象,但与同一页面中的其他建议一样,都无效。
关于如何解决该问题的任何想法吗?
最佳答案
按照说明(“在不同的HtmlElement中重用相同的组件ID完全可以”),在不同的HtmlElement中使用相同的组件,因此关系应该是ManyToOne而不是OneToOne。 HtmlElement实体应如下所述:
@ManyToOne
@JoinColumn(name = "COMPONENT_ID")
private Component component;
PS:不要使用cascade = CascadeType.ALL,因为如果删除了一个HTMLElement,则关联的组件也将被删除,该组件与其他HTMLElement链接。