Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

mapeamento de list no hibernate 3.2

Olá,

Eu comecei a pouco tempo a trabalhar e estudar o Hibernate. Estou trabalhando com um sistema legado que não utiliza JPA, apenas Hibernate versão 3.2 com mapeamento xml...

Eu tenho um objeto Ticket que possui uma lista de TicketItem. O mapeamento xml dessa lista é o seguinte:

<bag cascade="all,,delete-orphan" inverse="true" lazy="false" name="ticketItems" table="TICKET_ITEM">
    <key>
        <column name="TICKET_ID" />
    </key>
    <one-to-many class="com.xxxxxxxxxxx.model.TicketItem" />
</bag>

Eu gostaria que: Ao persistir um objeto Ticket com itens em sua lista de TicketItem a tabela TicektItem também fosse preenchida com os dados fornecidos.

Veja abaixo o trecho do meu código no qual eu crio um TicketItem e adiciono ele no Ticket. Ao salvar o Ticket apenas o Ticket é salvo, a tabela referente ao TicketItem não é preenchida.... Poderiam me ajudar?

                Terminal terminal = TerminalDAO.getInstance().load(3009);
        User user = UserDAO.getInstance().load(1);    
        Shift shift = ShiftDAO.getInstance().load(1);
               MenuItem item = MenuItemDAO.getInstance().load(67);

        TicketItem ticketItem = new TicketItem();
        ticketItem.setMenuItem(item);
        ticketItem.setItemQuantity(2.0);
        ticketItem.setName("GRILLED CHICKEN");
        ticketItem.setGroupName("SANDWITCH PLATTER");
        ticketItem.setCategoryName("LUNCH N DINNER");
        ticketItem.setUnitPrice(2.0);
        ticketItem.setSubtotalAmount(2.0);
        ticketItem.setSubtotalAmountWithoutModifiers(2.0);
        ticketItem.setTotalAmount(2.0);
        ticketItem.setTotalAmountWithoutModifiers(2.0);
        ticketItem.setBeverage(false);
        ticketItem.setShouldPrintToKitchen(true);
        ticketItem.setHasModifiers(true);
        ticketItem.setPrintedToKitchen(true);
        ticketItem.setStatus("Waiting");

        Ticket ticket = new Ticket();
        ticket.setTerminal(terminal);
        ticket.setOwner(user);
        ticket.setShift(shift);
        ticket.setTicketType("DINE IN");
        ticket.setVersion(1);

        List<TicketItem> list = new ArrayList<TicketItem>();
        list.add(ticketItem);
        ticket.setTicketItems(list);

        TicketDAO ticketDao = TicketDAO.getInstance();
        ticketDao.save(ticket);
5 respostas

Pelo que entendi a lista ta vazia.. tenta adicionar o TicketItem criado na lista.

ah perdão.... eu adicionei o item na lista mas agora recebo "session already closed"...

Eu estou fazendo esse teste fora de um dao, eu vou ter que criar um método no dao que use apenas uma sessão para carregar todos esses objetos que estou carregando pra dar certo?

Eu alterei o meu código mas ainda não funciona. Quando eu salvo Ticket as linhas de TicketItem não são salvas.

public static void main(String[] args) {

        Session session = null;
        Transaction tx = null;

        try {
            session = TicketDAO.getInstance().createNewSession();
            tx = session.beginTransaction();

            Terminal terminal = TerminalDAO.getInstance().load(3009);

            User user = UserDAO.getInstance().load(1);

            Shift shift = ShiftDAO.getInstance().load(1);

            MenuItem item = MenuItemDAO.getInstance().load(67);

            TicketItem ticketItem = new TicketItem();
            ticketItem.setMenuItem(item);
            ticketItem.setItemQuantity(2.0);
            ticketItem.setName("GRILLED CHICKEN");
            ticketItem.setGroupName("SANDWITCH PLATTER");
            ticketItem.setCategoryName("LUNCH N DINNER");
            ticketItem.setUnitPrice(2.0);
            ticketItem.setSubtotalAmount(2.0);
            ticketItem.setSubtotalAmountWithoutModifiers(2.0);
            ticketItem.setTotalAmount(2.0);
            ticketItem.setTotalAmountWithoutModifiers(2.0);
            ticketItem.setBeverage(false);
            ticketItem.setShouldPrintToKitchen(true);
            ticketItem.setHasModifiers(true);
            ticketItem.setPrintedToKitchen(true);
            ticketItem.setStatus("Waiting");

            Ticket ticket = new Ticket();
            ticket.setTerminal(terminal);
            ticket.setOwner(user);
            ticket.setShift(shift);
            ticket.setTicketType("DINE IN");
            ticket.setVersion(1);

            List<TicketItem> list = new ArrayList<TicketItem>();
            list.add(ticketItem);

            ticket.setTicketItems(list);

            Hibernate.initialize(ticket.getTicketItems());

            session.saveOrUpdate(ticket);

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }

    }

É, olhando o código para mim faz sentido, mas realmente não lembro nada do mapeamento em XML... Olhando a estrutura ali também faz sentido pra mim, você definiu o Cascade e tudo mais.

solução!

Eu encontrei o problema, as linhas de TicketItem estão sendo geradas, mas não são geradas com o id do Ticket....eu filtrava a tabela ticket_item pelo id do novo ticket gerado e não aparecia nenhuma linha então eu pensava que as linhas não tinham sido geradas.....

As linhas de ticket_item foram geradas sem o id to ticket simplesmente porque não foram setadas...

Ticket ticket = new Ticket();
            ticket.setTerminal(terminal);
            ticket.setOwner(user);
            ticket.setShift(shift);
            ticket.setTicketType("AUTO-ATENDIMENTO");
            ticket.setVersion(1);

            TicketItem ticketItem = new TicketItem();
            ticketItem.setMenuItem(item);
            ticketItem.setItemQuantity(2.0);
            ticketItem.setName("GRILLED CHICKEN");
            ticketItem.setGroupName("SANDWITCH PLATTER");
            ticketItem.setCategoryName("LUNCH N DINNER");
            ticketItem.setUnitPrice(2.0);
            ticketItem.setSubtotalAmount(2.0);
            ticketItem.setSubtotalAmountWithoutModifiers(2.0);
            ticketItem.setTotalAmount(2.0);
            ticketItem.setTotalAmountWithoutModifiers(2.0);
            ticketItem.setBeverage(false);
            ticketItem.setShouldPrintToKitchen(true);
            ticketItem.setHasModifiers(true);
            ticketItem.setPrintedToKitchen(true);
            ticketItem.setStatus("Waiting");

            ticketItem.setTicket(ticket);

            ticket.addToticketItems(ticketItem);

            session.saveOrUpdate(ticket);