Карта / Доступ к объектам с составным ключом - PullRequest
0 голосов
/ 21 апреля 2020

В моем приложении у меня есть 3 основных класса, как описано ниже.

public class Semana {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Integer series;

    private String observacao;

    private Integer ordenacao;


    @OneToMany(mappedBy = "semana")
    @JsonBackReference
    @OrderBy("ordenacao asc ")
    private List<TreinoOrdenado> treinoOrdenados;
 }
public class TreinoOrdenado {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "id_semana")
    private Semana semana;

    @ManyToOne
    @JoinColumn(name = "id_treino")
    private Treino treino; // can be repeated in the database but with different "ordenacao" 

    private Integer ordenacao;

}
@Table(name = "exercicio_ordenado")
public class ExercicioOrdenado {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "id_treino")
    @JsonBackReference
    @ToString.Exclude
    private Treino treino;

    @ManyToOne
    @JoinColumn(name = "id_exercicio")
    private Exercicio exercicio;

    private Integer ordenacao;

   @ManyToOne
   @JoinTable(name = "parametro")
   private Parametro parametro;

}

И этот Parametro класс, который является отношением между этими 3 классами.

public class Parametro {

    @EmbeddedId
    private ParametroId parametroId = new ParametroId();

    @MapsId("semana")
    @OneToOne
    @JoinColumn(name = "semana_id")
    private Semana semana;

    @MapsId("treino")
    @OneToOne
    @JoinColumn(name = "treino_id")
    private TreinoOrdenado treino;

    @MapsId("exercicio")
    @OneToOne
    @JoinColumn(name = "exercicio_id")
    private ExercicioOrdenado exercicio;

    private Integer series;

    private String repeticoes;

    private String observacao;

}
public class ParametroId implements Serializable {

    @Column(name = "semana_id")
    private Long semana;

    @Column(name = "treino_id")
    private Long treino;

    @Column(name = "exercicio_id")
    private Long exercicio;

}

Итак, вот моя проблема. Я хочу иметь возможность получить доступ к Parametro из родительского класса ExercicioOrdenado , но для того, чтобы его можно было отличить в базе данных, класс Parametro нуждается в референте из двух других (Semana, TreinoOrdenado ).

С моим текущим отображением я получил эту ошибку:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource 
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Foreign key (FK73ewcy2r50kw71o4he51dkolv:parametro 
[parametro_exercicio_id,parametro_semana_id,parametro_treino_id])) must have same number of columns as the referenced primary key (parametro [id])

Я могу сохранить paremetros в базе данных с помощью:

   parametros.setSemana(semana);
   parametros.setExercicio(exercicioOrdenado);
   parametros.setTreino(treinoOrdenado);
   parametroRepository.save(parametros);

Но я не могу получить из ExercicioOrdenado с отображением.

Я не знаю правильный подход для этого.

1 Ответ

0 голосов
/ 22 апреля 2020

Я думаю, что теперь способ ...

Для этого мы можем использовать аннотации @Embeddable и @EmbeddedId. В этой ссылке есть примеры. https://www.baeldung.com/jpa-composite-primary-keys

@Entity
public class Parametro {

    @EmbeddedId
    private ParametroId parametroId;


    @OneToOne
    @JoinColumn(name = "exercicio_id")
    @ForeignKey(name = "fk_exercicio_id")
    private ExercicioOrdenado exercicio;    

    @OneToOne
    @JoinColumn(name = "semana_id")
    @ForeignKey(name = "fk_semana_id")
    private Semana semana;


    @OneToOne
    @JoinColumn(name = "treino_id")
    @ForeignKey(name = "fk_treino_id")
    private TreinoOrdenado treino;

    private Integer series;

    private String repeticoes;

    private String observacao;
}

@Embeddable
public class ParametroId {


    private log id;

    private log semana;


    private log treino;

    private log exercicio;

}

Я считаю, что это способ создания персонализированного первичного ключа с использованием jpa. Я не проверял отношения сущностей в первичном ключе. Я знаю, что для этого существует несколько форм.

JPA @OneToOne с общим идентификатором - можно ли сделать это лучше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...