gpt4 book ai didi

java - 使用组合键映射/访问实体

转载 作者:行者123 更新时间:2023-12-01 17:17:32 25 4
gpt4 key购买 nike

在我的应用程序中,我有 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;

}

所以,这是我的问题。我希望能够从它的父类 ExercicioOrdenado 访问 Parametro,但为了在数据库中区分,类 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 检索。

我不知道执行此操作的正确方法。

最佳答案

我想我现在有办法...

为此,我们可以使用 @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 with Shared ID -- Can I do this Better?

关于java - 使用组合键映射/访问实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61352555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com