首页 > 解决方案 > hibernate & jpa:具有复合主键的表:自动增量问题

问题描述

我有那些实体:

@Entity
public class Carburant implements Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_carburant")
    private long id;
    private String nom;
    private String description;

    @JsonIgnore
    @OneToMany(mappedBy="carburant")
    private Set<HistCarb> stations ;

    public Carburant() {
        super();
    }
}

2

@Entity
@Table(name="Station")
public class Station implements Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_station")
    private long id ;
    private String nom;
    private String ville;
    private String adresse;

    @Transient
    private boolean nul = false;

    @JsonIgnore
    @OneToMany(mappedBy="station")
    private Set<HistCarb> historiques ;

    public Station() {
        super();
    }
}

3

@Entity

public class HistCarb implements Serializable{

    @Id
    @Column(name="id",updatable=false,nullable=false)
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    private Date date;
    private Integer prix;

    @Id
    @ManyToOne
    @JoinColumn(name="id_station")

    private Station station ;

    @Id
    @ManyToOne
    @JoinColumn(name="id_carburant")
    private Carburant carburant ;


    public HistCarb() {
        super();

    }
}

类图: 在此处输入图像描述

她的问题是:休眠给我这个表HistCarb的sql代码:

create table HistCarb (
       id bigint not null,
        date datetime,
        prix integer,
        id_station bigint not null auto_increment,
        id_carburant bigint not null,
        primary key (id_station, id, id_carburant)
    ) engine=InnoDB

使用 id_station auto_increment 但我希望休眠只生成列 id 作为 auto_increment 字段,正如我在实体 3 中提到的那样,我希望有人可以帮助我解决这个问题。我没有为实体 3 使用嵌入式 ID 我认为我们可以在没有嵌入式 ID 的情况下做到这一点,因为我发现它很难实现,并且当我尝试在这种情况下使用嵌入式 ID 时会出现一些错误。

标签: javamysqlhibernatejpa

解决方案


HistCarb您拥有@Id3 个字段时,这就是您获得复合键的原因。像这样删除@Idstationcarburant

@Entity
public class HistCarb implements Serializable{

    @Id
    @Column(name="id",updatable=false,nullable=false)
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    private Date date;
    private Integer prix;

    @ManyToOne
    @JoinColumn(name="id_station")

    private Station station ;

    @ManyToOne
    @JoinColumn(name="id_carburant")
    private Carburant carburant ;


    public HistCarb() {
        super();

    }
}

推荐阅读