Несколько Встраиваемых> Обнаружено несколько ссылок на ассоциации
У меня есть существующий большой объект со многими полями, существующими в 3-х экземплярах.
@Entity
@Data
@NoArgsConstructor
public class MyClassA{
@Id
private String id;
// copy 1
private String copy1Val1;
private String copy1Val2;
...
@manyToOne
private MyClassB copy1ObjB;
// copy 2
private String copy2Val1;
private String copy2Val2;
...
@manyToOne
private MyClassB copy2ObjB;
// copy 3
private String copy3Val1;
private String copy3Val2;
...
@manyToOne
private MyClassB copy3ObjB;
}
@Entity
@Data
@NoArgsConstructor
public class MyClassB {
@id
private String myId;
...
}
Это работает, но обработка значений сложна без причины. Я хочу разделить эти значения на небольшой объект (гораздо проще сравнивать, переключать...) без обновления существующей базы данных. Поэтому я пытаюсь использовать бин @Embeddable.
@Embeddable
@Data
@NoArgsConstructor
public class EmbeddableValueSet {
private String val1;
private String val2;
...
@manyToOne
private MyClassB objB;
}
Я уже решил сторону базы данных, используя @AttributeOverrides и @AssociationOverride.
@AttributeOverrides({ @AttributeOverride(name = "val1", column = @Column(name = "COPY1_VAL1")),
@AttributeOverride(name = "val2", column = @Column(name = "COPY1_VAL2")),
...
})
@AssociationOverride(name = "objB", joinColumns = @JoinColumn(name = "COPY1_OBJB_MY_ID"))
@Embedded
private EmbeddableValueSet copy1 = new EmbeddableValueSet();
Но экспорт json не удался:
"message": "Could not write content: Detected multiple association links with same relation type! Disambiguate association @javax.persistence.ManyToOne(optional=true, targetEntity=void, cascade=[], fetch=EAGER) private my.package.MyClassB my.package.EmbeddableValueSet.objB using @RestResource!; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Detected multiple association links with same relation type! Disambiguate association @javax.persistence.ManyToOne(optional=true, targetEntity=void, cascade=[], fetch=EAGER) private my.package.MyClassB my.package.EmbeddableValueSet.objB using @RestResource!",
"path": "/myClassAs/myPKValue"
Следуя совету Оливера Гирке, я попытался использовать @RestResource.
Baeldung также подтверждает это решение, изменяя только значение rel.
Но если я добавлю эту аннотацию к определению копии, это, похоже, не даст никакого эффекта.
@RestResource(path = "objB", rel = "copy1ObjB")
private EmbeddableValueSet copy1 = new EmbeddableValueSet();
Если я помещу эту аннотацию в мой EmbeddableValueSet, я могу удалить ссылку. (Очевидно, попробуйте переименовать сообщение об ошибке изменения значения rel, но проблема все еще здесь).
@ManyToOne
@RestResource(path = "objB", exported = false)
private MyClassB objB;
С решением Json поколение успешно, но я потерял свои связи.
Есть ли что-то, что я делаю неправильно или отсутствует? Есть ли проблема с несколькими экземплярами @Embedded?