Jakarta ee 使用JAXB解组JPA实体

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

我的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 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
作为SQL
event\u ID
插入但是
项.event
@xmltransive
,因此不从JSON读取,因此
为null

也许您应该将
insertable=false,updateable=false
设置为
Item
(字段
pair
event
)中的关系,并让主键(
ItemPk
)的字段可以插入和更新

(我感觉这会导致其他问题,因此需要进行一些额外的调整。)