Spring Boot - 在REST POST请求时仅保存ID,但在GET请求时获取对象

时间:2016-01-01 14:03:22

标签: hibernate rest spring-boot

我正在使用spring boot构建restful web app。我有一个名为“货币”的实体,我有另一个名为“事件”的实体,它们看起来像这样:

@Entity
@Table(name = "currency")
public class Currency {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "title")
    String title;

    public Currency() {
    }

    public long getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

和Event实体(省略了一些列):

@Entity
@Table(name = "event")
public class Event {

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(table = "currency", name = "id")
    private Currency currency;

    public Event() {}

    public Currency getCurrency() {
        return currency;
    }

    public void setCurrency(Currency currency) {
        this.currency = currency;
    }
}

我已经在货币表中有货币(美元,欧元等),我不希望这个表中有任何其他数据,我想在事件表中只有货币的id,而不是整个对象,所以我怎么样在GET-ing事件中可以设法使用Currency对象(带货币名称和id),但在发布新事件时只插入id?

1 个答案:

答案 0 :(得分:0)

首先,除非只有一个事件可以与给定货币相关联,否则您的映射是错误的:事件和货币之间的关联应该是ManyToOne,而不是OneToOne:许多事件共享相同的货币。

现在回答你的问题。保存事件时,您将从浏览器接收包含事件信息的一些JSON对象,包括事件所引用的货币的ID。因此,您需要做的就是获取由此id标识的Currency实例,然后创建并保留包含该货币的Event实例:

Currency currnecy = em.find(Currency.class, currencyId);
// or, if you don't even want to hit the database:
// Currency currnecy = em.getReference(Currency.class, currencyId);

Event event = new Event();
event.setCurrency(currency);
em.persist(event);