使用JPA将列表元素及其ids存储在额外的表中

时间:2016-07-27 11:11:24

标签: jpa

我们说我有一个对象Car,其中包含List<Wheel>。我有四个车轮位置,每个位置可以带一个或没有车轮。我使用@ManyToMany对其进行了建模,因为这是特定情况所必需的。

Car

@Entity
public class Car implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name="CAR_WHEEL", joinColumns=@JoinColumn(name="CAR_ID", referencedColumnName="ID"),
        inverseJoinColumns = @JoinColumn(name = "WHEEL_ID", referencedColumnName = "ID"))
    private List<Wheel> wheels;

    // constructors, getters, setters ...

}

Wheel

@Entity
public class Wheel implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @ManyToMany(mappedBy="wheels")
    private List<Car> cars;

    // constructors, getters, setters ...

}

在我看来,我将轮子保存到列表中的特定位置。例如,如果您有以下关系:

位置1:第3轮

位置2:无轮

位置3:轮1

位置4:无轮

列表如下所示:[my.model.Wheel@fbc9ffe, null, my.model.Wheel@3d14ead8, null]

在保存WHEEL_POSITION之后,我现在希望有一个表Car,如下所示:

WHEEL_POSITION
id      wheel       position
1       3           0
2       null        1
3       1           2
4       null        3

该位置是列表中Wheel - 对象的索引。

我如何继续,以便此表由JPA创建?

1 个答案:

答案 0 :(得分:0)

解决方案是,向实体@OrderColumn添加Car注释(感谢Neil Stockton):

@Entity
public class Car implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name="CAR_WHEEL", joinColumns=@JoinColumn(name="CAR_ID", referencedColumnName="ID"),
        inverseJoinColumns = @JoinColumn(name = "WHEEL_ID", referencedColumnName = "ID"))
    @OrderColumn
    private List<Wheel> wheels;

    // constructors, getters, setters ...

}

它在表格中添加了一个新列。