Jakarta ee 使用JAXB解组JPA实体
我的JAX-RS服务在使用JAXB将JSON字符串解组回JPA实体时遇到了问题。编组工作正常,我从服务中获得以下JSON字符串:Jakarta ee 使用JAXB解组JPA实体,jakarta-ee,jpa,jaxb,eclipselink,Jakarta Ee,Jpa,Jaxb,Eclipselink,我的JAX-RS服务在使用JAXB将JSON字符串解组回JPA实体时遇到了问题。编组工作正常,我从服务中获得以下JSON字符串: { "id":1, "items":[{ "id":{"pairName":"PAIR-1","eventId":1}, "pair":{"name":"PAIR-1","val":1.0},"quantity":2} ]} } 但是,将此字符串发送回“我的服务”时会出现错误: Internal Excepti
{
"id":1,
"items":[{
"id":{"pairName":"PAIR-1","eventId":1},
"pair":{"name":"PAIR-1","val":1.0},"quantity":2}
]}
}
但是,将此字符串发送回“我的服务”时会出现错误:
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Column EVENT_ID' cannot accept a NULL value.
Error Code: -1
Call: INSERT INTO ITEM (QUANTITY, EVENT_ID, PAIR_NAME) VALUES (?, ?, ?) bind => [2, null, PAIR-1]
事件ID在字符串中,如何取回该对象?我将JavaEE5、JPA1.0与Jersey和EclipseLink一起使用
JPA实体
@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Event implements Serializable {
@Id
private long id;
@OneToMany(mappedBy = "event")
@XmlInverseReference(mappedBy = "event")
private List<Item> items;
}
@Entity
@XmlAccessorType(XmlAccessType.FIELD)
public class Item implements Serializable {
@EmbeddedId
private ItemPk id;
@ManyToOne(cascade = { CascadeType.ALL })
private Pair pair;
@ManyToOne
@JoinColumn(name = "EVENT_ID")
@XmlTransient
private Event event;
private int quantity;
}
@Embeddable
@XmlAccessorType(XmlAccessType.FIELD)
public class ItemPk implements Serializable {
@Column(name="PAIR_NAME", insertable=false, updatable=false)
private String pairName;
@Column(name="EVENT_ID", insertable=false, updatable=false)
private long eventId;
}
@Entity
public class Pair implements Serializable {
@Id
private String name;
private float val;
}
@实体
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共类事件实现可序列化的{
@身份证
私人长id;
@OneToMany(mappedBy=“事件”)
@XmlInverseReference(mappedBy=“事件”)
私人清单项目;
}
@实体
@XmlAccessorType(XmlAccessType.FIELD)
公共类项实现可序列化{
@嵌入ID
私有项pkid;
@ManyToOne(cascade={CascadeType.ALL})
私人配对;
@许多酮
@JoinColumn(name=“EVENT\u ID”)
@XmlTransient
私人活动;
私人整数数量;
}
@可嵌入
@XmlAccessorType(XmlAccessType.FIELD)
公共类ItemPk实现可序列化的{
@列(name=“PAIR\u name”,insertable=false,updateable=false)
私有字符串配对名;
@列(name=“EVENT\u ID”,insertable=false,updateable=false)
私人长事件ID;
}
@实体
公共类对实现可序列化{
@身份证
私有字符串名称;
私人浮动增值税;
}
JAX-RS服务
@Path("/events")
public class EventService {
private EntityManagerFactory entityManagerFactory;
@SuppressWarnings("unchecked")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Event> list() {
if (entityManagerFactory == null) {
entityManagerFactory = Persistence.createEntityManagerFactory("service");
}
EntityManager entityManager = entityManagerFactory.createEntityManager();
Query query = entityManager.createNamedQuery("Event.findAll");
return query.getResultList();
}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public void update(Event event) {
if (entityManagerFactory == null) {
entityManagerFactory = Persistence.createEntityManagerFactory("service");
}
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.merge(event);
entityManager.getTransaction().commit();
}
}
@Path(“/events”)
公共类事件服务{
私人实体管理工厂实体管理工厂;
@抑制警告(“未选中”)
@得到
@产生(MediaType.APPLICATION_JSON)
公开名单(){
if(entityManagerFactory==null){
entityManagerFactory=Persistence.createEntityManagerFactory(“服务”);
}
EntityManager EntityManager=EntityManager工厂。createEntityManager();
Query Query=entityManager.createNamedQuery(“Event.findAll”);
返回query.getResultList();
}
@放
@使用(MediaType.APPLICATION_JSON)
公共作废更新(事件){
if(entityManagerFactory==null){
entityManagerFactory=Persistence.createEntityManagerFactory(“服务”);
}
EntityManager EntityManager=EntityManager工厂。createEntityManager();
entityManager.getTransaction().begin();
entityManager.merge(事件);
entityManager.getTransaction().commit();
}
}
可能是ItemPk.eventId
是insertable=false,updateable=false
,因此JPA不会尝试插入此字段。相反,它尝试将字段Item.event
作为SQLevent\u ID
插入但是项.event
是@xmltransive
,因此不从JSON读取,因此为null
也许您应该将insertable=false,updateable=false
设置为Item
(字段pair
和event
)中的关系,并让主键(ItemPk
)的字段可以插入和更新
(我感觉这会导致其他问题,因此需要进行一些额外的调整。)