Java 无法在有状态会话bean中持久化

Java 无法在有状态会话bean中持久化,java,jakarta-ee,netbeans,ejb,stateful,Java,Jakarta Ee,Netbeans,Ejb,Stateful,我正在使用JavaEE应用程序的有状态会话bean方法制作一个购物车。我的计划是,用户单击“签出”按钮后,订单将添加到数据库中。但是,该顺序不会在数据库中更新 ShoppingCartFacade.java @Stateful public class ShoppingCartFacade implements ShoppingCartFacadeLocal { @PersistenceContext(unitName = "DProject-ejbPU", type = Persi

我正在使用JavaEE应用程序的有状态会话bean方法制作一个购物车。我的计划是,用户单击“签出”按钮后,订单将添加到数据库中。但是,该顺序不会在数据库中更新

ShoppingCartFacade.java

@Stateful
public class ShoppingCartFacade implements ShoppingCartFacadeLocal {

    @PersistenceContext(unitName = "DProject-ejbPU", type = PersistenceContextType.EXTENDED)
    private EntityManager em;

    private void create(Tickettable tickettable) {
        em.persist(tickettable);
    }

    private ArrayList<Tickettable> ticketCart;

    @PostConstruct
    private void initializeBean(){
        ticketCart = new ArrayList<>();
    }

    @Override
    public boolean add(Tickettable tickettable) {
        boolean result = false;

        //Set the correct user and showtime table
        tickettable.setUserid(this.getUsertableFrom(tickettable.getUserid().getUserid()));
        tickettable.setShowtimeid(this.getShowtimetableFrom(tickettable.getShowtimeid().getShowtimeid()));

        try {
            //Already have ticket for this showtime
            for (Tickettable ticket : ticketCart) {
                if (ticket.getShowtimeid().getShowtimeid().equals(tickettable.getShowtimeid().getShowtimeid())) {
                    ticket.setQuantity(ticket.getQuantity() + tickettable.getQuantity());
                    result = true;
                }
            }
            //New ticket
            if (!result) {
                ticketCart.add(tickettable);
                result = true;
            }
        } catch (Exception ex) {
        }
        return result;
    }

    @Override
    public ArrayList<Tickettable> getCart() {
        return ticketCart;
    }

    @Override
    public boolean checkOut() {
        try {
            for (Tickettable ticket : ticketCart) {
                create(ticket);
            }
            ticketCart.clear();
            return true;
        } catch (Exception e) {
        }
        return false;
    }

    private Usertable getUsertableFrom(String userId) {
        Usertable u = em.getReference(Usertable.class, userId);
        return u;
    }

    private Showtimetable getShowtimetableFrom(String showtimeId) {
        Showtimetable s = em.getReference(Showtimetable.class, showtimeId);
        return s;
    }

    @Remove
    public void remove() {
        ticketCart = null;
    }
}
***********************更新**********************


我刚通过测试。shoppingcartafacade.java中的cartList为空。

您需要了解正在使用的各种bean的生命周期管理

@Stateful
bean与servlet/JSF会话没有隐式关联

将为每个传入请求创建一个新的
ShoppingCartManagedBean
实例,因为它是
@RequestScoped
。此实例将自动获取对
ShoppingCartManagement
的新实例的引用,而该实例又将获取对
ShoppingCartManagement
的新实例的引用

您需要:

  • ShoppingCartManagedBean
    更改为
    @SessionScoped
    ,或

  • 创建一个
    @SessionScoped
    facade,将其委托给
    ShoppingCartManagement
    引用,并将其插入EJB中


  • 这两种方法中的任何一种都会将您的有状态会话bean与servlet/JSF会话相关联。

    在类
    ShoppingCartFacade
    中,方法
    add()
    checkout()
    正在吞咽异常,因此如果抛出异常,您对其一无所知。
    @Stateful
    public class ShoppingCartManagement implements ShoppingCartManagementRemote {
        @EJB
        private ShoppingCartFacadeLocal shoppingCartFacade;
    
        @Override
        @PermitAll
        public boolean add(TicketDTO ticketDTO) {
           if (ticketDTO == null) {
                // just in case
                return false;
            }
    
            // convert to entity
            Tickettable ticket = Utility.ticketDTO2Entity(ticketDTO);
            // add one
            return shoppingCartFacade.add(ticket);
        }
    
        @Override
        @PermitAll
        public ArrayList<TicketDTO> getCart() {
            try {
                ArrayList<Tickettable> alst = shoppingCartFacade.getCart();
    
                if (alst.isEmpty()) {
                    //not found
                    return null;
                } else {
                    ArrayList<TicketDTO> alsDTO = new ArrayList<>(alst.size());
                    for (Tickettable stt : alst) {
                        TicketDTO stDTO = Utility.ticketEntity2DTO(stt);
                        alsDTO.add(stDTO);
                    }
                    return alsDTO;
                }
            } catch (NullPointerException e) {
                throw e;
            }
        }
    
        @Override
        @PermitAll
        public boolean checkOut() {
            return shoppingCartFacade.checkOut();
        }
    }
    
    @Named(value = "shoppingCartManagedBean")
    @RequestScoped
    public class ShoppingCartManagedBean implements Serializable{
    
     .....
    
        @EJB
        private ShoppingCartManagementRemote shoppingCartManagement;
    
        public String addTicket(){
    
            this.quantity += 1;
    
            UserDTO u = new UserDTO(userId,"","","","","");
            ShowtimeDTO s = new ShowtimeDTO(showtimeId,"","","","","");
    
            TicketDTO t = new TicketDTO("111111",u,s,Integer.toString(this.quantity));
            //carts = shoppingCartManagement.getCart();
            boolean result =  shoppingCartManagement.add(t);
            if(result){
                return "success";
            }
            return "failure";
        }
    
        public String checkout(){
            /*return shoppingCartManagement.checkOut();*/
    
            boolean result = shoppingCartManagement.checkOut(); 
            if(result) return "success";
            return "failure";
        }
    }