java - 使用 Hibernate 注释将外部键作为主键的一部分

标签 java mysql hibernate jpa

我在 CarDatatableProgress 之间存在一对多关系,因此一辆 car 可能有更多 DatatableProgress 但一个 DatatableProgress 元素属于一辆 carCaridCar 作为主键,datatableProgressdatatableNamesheet 作为主键,但我必须添加 idCar (外键)作为主键的一部分。 我尝试使用此代码,但收到 mappedBy 引用未知目标实体属性:com.domain.Car.datatablesProgress 中的 com.domain.DatatableProgress.car。我需要这个,因为我可以有一个具有相同名称和工作表但不同汽车的 datatableProgress。 :

数据表进度:

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

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    private DatatableProgressKeys datatableProgressKeys;
    private Integer actualStoredRow;    

    @MapsId("car")
    @JoinColumns({
        @JoinColumn(name="idCar_fk", referencedColumnName="idCar"),
    })
    @ManyToOne(fetch = FetchType.LAZY) 
    private Car car;

    public DatatableProgress() {
    }


    public DatatableProgress(DatatableProgressKeys datatableProgressKeys, Integer actualStoredRow) {
        this.datatableProgressKeys = datatableProgressKeys;
        this.actualStoredRow = actualStoredRow;
    }


    /**
     * @return the datatableKeys
     */
    @EmbeddedId
    public DatatableProgressKeys getDatatableProgressKeys() {
        return datatableProgressKeys;
    }


    /**
     * @param datatableKeys the datatableKeys to set
     */
    public void setDatatableProgressKeys(DatatableProgressKeys datatableProgressKeys) {
        this.datatableProgressKeys = datatableProgressKeys;
    }


    @Column(name = "actualStoredRow", nullable = false)
    public Integer getActualStoredRow() {
        return this.actualStoredRow;
    }

    public void setActualStoredRow(Integer actualStoredRow) {
        this.actualStoredRow = actualStoredRow;
    }
}

数据表进度键

@Embeddable
public class DatatableProgressKeys implements Serializable {
    private static final long serialVersionUID = 1L;
    private String datatableName;
    private Integer sheet;
    private Car car;


    public DatatableProgressKeys() {}

    public DatatableProgressKeys(String datatableName, Integer sheet, Car car) {
        this.datatableName = datatableName;
        this.sheet = sheet;
        this.setCar(car);
    }


    @Column(name = "datatableName", nullable = false)
    public String getDatatableName() {
        return this.datatableName;
    }

    public void setDatatableName(String datatableName) {
        this.datatableName = datatableName;
    }


    @Column(name = "sheet", nullable = false)
    public Integer getSheet() {
        return this.sheet;
    }

    public void setSheet(Integer sheet) {
        this.sheet = sheet;
    }

    /**
     * @return the car
     */
    @Column(name = "id_car", nullable = false)
    public Car getCar() {
        return car;
    }

    /**
     * @param car the car to set
     */
    public void setCar(Car car) {
        this.car = car;
    }

//hashCode and equals 

汽车

@Entity
@Table(name = "car")
public class Car implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Integer idCar;
    private Integer initialKm;

    @JsonIgnore
    private Set<DatatableProgress> datatablesProgress = new HashSet<DatatableProgress>(0);

    public Car() {
    }

    public Car(Integer initialKm) {
        this.initialKm = initialKm;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id_car", unique = true, nullable = false)
    public Integer getIdCar() {
        return this.idCar;
    }

    public void setIdCar(Integer idCar) {
        this.idCar = idCar;
    }

    @Column(name = "initialKm", nullable = false)
    public Integer getInitialKm() {
        return this.initialKm;
    }

    public void setInitialKm(Integer initialKm) {
        this.initialKm = initialKm;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "car")
    public Set<DatatableProgress> getDatatablesProgress() {
        return this.datatablesProgress;
    }

    public void setDatatablesProgress(Set<DatatableProgress> datatablesProgress) {
        this.datatablesProgress = datatablesProgress;
    }
}

更新:是否可以在不修改 Car 实体的情况下进行此更改(因此没有 CarKey 类)?

最佳答案

要成为复合键实体的一部分,应该是@Embedable。 您可以仅使用一个 Integer 字段为 Car 类创建一个单独的键实体,然后将此键类用作复合键。 参见Hibernate docs

关于java - 使用 Hibernate 注释将外部键作为主键的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47577365/

相关文章:

mysql - 获取错误代码 : 8155 No column was specified for column 2 of 'pol' in SQL server

json - 使用 Spring Boot 和 Hibernate 的 Jackson - 使用 @JsonIdentityInfo 从 Id 创建对象

java - Hibernate 在新线程中延迟加载

java - Redis key 命令未显示所有 key

java - 如何安全地存储外部服务的凭据

java - 为什么代码会面临看到部分构造的对象的风险?

php - 使用 PHP 生成和分发唯一的用户名

mysql - 使用 phpmyadmin 导出 varbinary 字段

java - 如何让 Hibernate 在运行时而不是在编译时删除并重新创建数据库?

java - Java EE 用户有多个角色?