Ho due tabelle:
area (
id int PK autoincrement
code varchar
)
products (
id int PK autoincrement
name varchar
area_id int PK to AREA
...
)
Le classi sono persistenti usando eclipselink in questo modo:
@Entity
class Product {
...
private Long id;
...
private String name;
...
@JoinColumn(name = "area_id", referencedColumnName = "id")
@ManyToOne
@Expose
private Area area;
...
}
Funziona bene. Ma sto creando un servizio di assistenza per un'API, un semplice PUT in link dove i dati JSON dovrebbero essere come questo:
{
id: xxx
name: xxxx
area: xxxx
}
Come puoi vedere, desidero che il campo area venga inviato in modo diverso. ID e nome sono gli stessi, ma in questo caso il campo area è la Stringa che è memorizzata in the table.row area.codice .
Aparently questo non può essere fatto con JPA (ho chiesto questo qui: link ) ma lì, qualcuno ha detto quanto segue:
Don't mix your entity and webservices classes and you wont have problem like this.
Quindi, stavo pensando se dovessi avere due classi Prodotto . Uno per il livello di servizio, quello che il cliente utilizzerà quando chiamano l'API, in questo modo:
public class Product implements Serializable {
private Long id;
private String name;
private String area;
}
E poi quando sto gestendo il metodo PUT / GET, converti questa classe in JPA. qualcosa di simile:
x.jpa.Product jpaProduct = new x.jpa.Product();
jpaProduct.setId(product.getId());
jpaProduct.setName(product.getName());
jpaProduct.getArea().setId( getAreaIdByCode(product.getArea()));
...
m.persist(jpaProduct);