@onetoone было найдено более одной строки с данным идентификатором - PullRequest
0 голосов
/ 06 января 2020

У меня есть объект: 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 Entity:

@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;

Компонент Entity:

@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;

Тип Entity:

@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 строки, но это не имеет никакого смысла, так как Компонент имеет различные html компоненты (input, select, et c) и HtmlElement использует идентификатор компонента и дополнительную информацию, относящуюся к этому, совершенно нормально повторно использовать один и тот же идентификатор компонента в разных элементах HtmlElements.

Я попытался каскадировать все и удалить сироту, как предложено в здесь но не сработало, как и другие предложения на той же странице. * 103 8 *

Есть идеи, как это исправить, пожалуйста?

1 Ответ

2 голосов
/ 06 января 2020

В соответствии с описанием («вполне можно повторно использовать один и тот же ID компонента в разных HtmlElements») один и тот же компонент используется в разных HtmlElement, поэтому отношения должны быть ManyToOne, а не OneToOne. Сущность HtmlElement должна быть такой, как указано ниже:

@ManyToOne
@JoinColumn(name = "COMPONENT_ID")
private Component component;

PS: не использовать cascade = CascadeType.ALL , потому что если один HTMLElement удален, связанный компонент также будет удален, связанный с другой HTMLElement.

...