2016-01-01 25 views
0

我正在使用spring引导来构建宁静的web应用程序。 “外币”我单位打电话,我都称为“事件”的另一个实体,它们看起来就像这样:Spring Boot - 仅当REST POST请求时保存ID,但GET请求时获取对象

@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; 
    } 
} 

和事件实体(某些列被省略):

@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的货币,而不是整个对象,所以我怎么可以管理货币对象(货币名称和id),而GET-ing事件,但是在发布新事件时只插入id?

回答

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); 
+0

谢谢您的回答,我了解了您的答案,但我应该在哪里获得该代码,我的意思是在控制器或服务或实体? – Shota

+0

这取决于你。访问EntityManager应该在DAO/Repository组件中。我倾向于直接从控制器访问存储库,除非逻辑很复杂并且/或者由许多控制器共享;在这种情况下,我使用一项服务。但这不是什么重要的事情。代码不重要。重要的是该解决方案的**原则**:根据现有实体的ID,您使用JPA获得对实体本身的引用,并将引用存储到新实体中。 –

+0

正如你所说,主要问题在于它是ManyToOne关系,而不是OneToOne。同样在@JoinColumn中,名称需要是Event entity not id中唯一的列名称(因为发生冲突)。谢谢。 – Shota