如何使用JPA将实体属性注入另一组实体?

时间:2017-02-04 16:36:37

标签: java hibernate jpa

我正在使用Java JPA处理我的第一个API项目。 该项目基于三个表(事件,阶段,evt_phases); event表示发布数据,phase表示预设的事件阶段,evt_phases链接阶段与事件,包含两个名为startend的字段;这些字段包含阶段的开始日期(时间)和结束日期(时间)。

enter image description here 这就是我创建数据库表的方法,问题是我目前有一个API,它返回包含event数组的phases contains属性,并且我想要包含start }和endevt_phase表格到phases

的数组
@Entity()
public class Event {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public
    Long id;

    String name;

    @Column(name = "short_desc")
    String short_description;

    @Column(name = "long_desc")
    String long_description;

    @OneToMany()
    @JoinTable(name = "evt_phase", joinColumns = @JoinColumn(name = "event_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "phase_id", referencedColumnName = "id"))
    Set<Phase> phases = new HashSet<>();

    @OneToMany()
    @JoinTable(name = "evt_resource", joinColumns = @JoinColumn(name = "event_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "resource_id", referencedColumnName = "id"))
    Set<Resource> resources = new HashSet<>();

    String place;

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setShort_description(String short_description) {
        this.short_description = short_description;
    }

    public String getShort_description() {
        return short_description;
    }

    public void setLong_description(String long_description) {
        this.long_description = long_description;
    }

    public String getLong_description() {
        return long_description;
    }

    public void setPlace(String place) {
        this.place = place;
    }

    public String getPlace() {
        return place;
    }

    public void setPhases(Set<Phase> phases) {
        this.phases = phases;
    }

    public Set<Phase> getPhases() {
        return phases;
    }

    public void setResources(Set<Resource> resources) {
        this.resources = resources;
    }

    public Set<Resource> getResources() {
        return resources;
    }
}

这是我写的phase实体

@Entity()
public class Phase {

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

    String name;

    @Column(name = "color")
    String backColor;

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setBackColor(String backColor) {
        this.backColor = backColor;
    }

    public String getBackColor() {
        return backColor;
    }
}

最后,这是中间表

@Entity()
@Table(name = "evt_phase")
public class EventPhase {

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

    @ManyToOne()
    private Phase phase;

    @ManyToOne()
    private Event event;

    @Column(name = "start")
    LocalDateTime startDate;

    @Column(name = "end")
    LocalDateTime endDate;

    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setPhase(Phase phase) {
        this.phase = phase;
    }

    public Phase getPhase() {
        return phase;
    }

    public void setEvent(Event event) {
        this.event = event;
    }

    public Event getEvent() {
        return event;
    }

    public void setStartDate(LocalDateTime startDate) {
        this.startDate = startDate;
    }

    public LocalDateTime getStartDate() {
        return startDate;
    }

    public void setEndDate(LocalDateTime endDate) {
        this.endDate = endDate;
    }

    public LocalDateTime getEndDate() {
        return endDate;
    }
}

1 个答案:

答案 0 :(得分:0)

为什么不在EventPhase实体中引入Event@Entity public class Event { ... @OneToMany(mappedBy = "event") Set<EventPhase> eventPhases = new HashSet<>(); } 之间的关系:

Set<Phase>

您甚至可以放弃Event关系,只需使用上述关系作为从Phase遍历到let stringDouble = String(describing: double) 的方法,除非您有某种原因需要直接链接。它没有任何伤害,如果你需要,它显然是一个捷径。