Несколько Встраиваемых> Обнаружено несколько ссылок на ассоциации

У меня есть существующий большой объект со многими полями, существующими в 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?

0 ответов

Другие вопросы по тегам