两个外键的复合主键

Jho*_*ina 6 hibernate jpa spring-mvc

我在实体结构中遇到问题,我正在使用 Hibernate + JPA。该类由用户分类组成,其中主键是用户(来自 Usuario 类),另一个是季节(来自 Temporada 类)。类结构下面:

@Entity(name = "CLASSIFICACAO")
@Data
public class Classificacao implements Serializable
{
  @Id
  @GeneratedValue(generator="SharedPrimaryKeyGenerator")
  @GenericGenerator(name="SharedPrimaryKeyGenerator",strategy="foreign",parameters =  @Parameter(name="property", value="usuario"))
  @Column(unique = true, nullable = false)
  private String classificacao;
  @Id
  @GeneratedValue(generator="SharedPrimaryKeyGenerator")
  @GenericGenerator(name="SharedPrimaryKeyGenerator",strategy="foreign",parameters =  @Parameter(name="property", value="temporada"))
  @Column(unique = true, nullable = false)
  private Long codTemporada;
  //another fields  
  @OneToOne
  @PrimaryKeyJoinColumn
  private Usuario usuario;
  @ManyToOne
  @PrimaryKeyJoinColumn
  private Temporada temporada;
}
Run Code Online (Sandbox Code Playgroud)

'classificacao' 字段从 Usuario 外键接收用户名;在我没有将“codTemporada”字段作为主要字段之前,它就像一个魅力。“classificacao”收到了用户并且是主要的,而“temporada”只是外国用户。但现在我也需要“codTemporada”字段成为主要字段,从而形成复合主键类。但我刚刚收到错误:br.com.xxxxx.model.Classificacao 的 usuario.id 的列映射已损坏。

我能做什么有什么建议吗?

Sha*_*rup 4

如果一个实体中有多个 id,则应该使用 EmbeddedId。这里你的两个Id都是外键约束,所以你需要使用@JoinColumn来加入它们。classificacao 类和 classificacaoId 类的示例代码。

分类器.java

@Entity
public class Classificacao implements Serializable {

    @Id
    ClassificacaoId id;

    String name;
    // getter and setter

}
Run Code Online (Sandbox Code Playgroud)

ClassificacaoId.java

@Embeddable
public class ClassificacaoId implements Serializable {

    @OneToOne
    @JoinColumn(name = "userId", referencedColumnName = "userId")
    private Usuario usuarioIo;

    @ManyToOne
    @JoinColumn(name = "tempId", referencedColumnName = "id")
    private Temporada temporada;

    // getter and setter

}
Run Code Online (Sandbox Code Playgroud)

在 h2 数据库中生成 SQL

create table classificacao (
    name varchar(255), 
    user_id varchar(255) not null, 
    temp_id bigint not null, 
    primary key (temp_id, user_id)
);
create table temporada (
    id bigint not null, 
    name varchar(255), 
    primary key (id)
);
create table usuario (
    user_id varchar(255) not null, 
    name varchar(255), 
    primary key (user_id)
);
alter table classificacao add constraint FK1najxwr5x189iul4rguqc4wyx 
foreign key (user_id) references usuario;
alter table classificacao add constraint FKlvk517howhduqt5ghb4mgx0ko 
foreign key (temp_id) references temporada;
Run Code Online (Sandbox Code Playgroud)