我有一个实体: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链接。

10-07 19:23
查看更多