【问题标题】:Composite primary key of two foreign keys两个外键的复合主键
【发布时间】:2020-10-16 13:38:41
【问题描述】:

我的实体结构有问题,我使用的是 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;
}

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

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

【问题讨论】:

    标签: hibernate spring-mvc jpa


    【解决方案1】:

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

    Classificacao.java

    @Entity
    public class Classificacao implements Serializable {
    
        @Id
        ClassificacaoId id;
    
        String name;
        // getter and setter
    
    }
    

    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
    
    }
    

    在 h2 db 中生成的 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;
    

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多