Como mapea uma coleção com hibernate anotation

3 respostas
jonatha_java

pessoal faz um tempão que estou apanhando com esse hibernate
alguem pode me ajuda como mapea uma coleção.
segui os passo do manual de referencia mais toda vez da o seguinte erro.

1159 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
Hibernate:
insert
into

Order (customer_id
, number)

values
(?, ?)
1231 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1064, SQLState: 42000
1231 [main] ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘Order (customer_id, number) values (1, ‘2’)’ at line 1

aqui esta minha classes.

@Entity
public class Order {
   @Id @GeneratedValue public Integer getId() { return id; }
   public void setId(Integer id) { this.id = id; }
   private Integer id;
   public String getNumber() { return number; }
   public void setNumber(String number) { this.number = number; }
   private String number;
   @ManyToOne
   public Customer getCustomer() { return customer; }
   public void setCustomer(Customer customer) { this.customer = customer; }
   private Customer customer;
}

@Entity  
public class Customer {
   @Id @GeneratedValue public Integer getId() { return id; }
   public void setId(Integer id) { this.id = id; }
   private Integer id;
   @OneToMany(mappedBy="customer")
   //@OrderColumn(name="orders_index")
   public List<Order> getOrders() { return orders; }
   public void setOrders(List<Order> orders) { this.orders = orders; }
   private List<Order> orders;
}
public class NewClass {

    public static void main(String[] agrs) {
  
try {
             AnnotationConfiguration cfg = new AnnotationConfiguration();
             cfg.addAnnotatedClass(Customer.class);
             cfg.addAnnotatedClass(Order.class);
             SessionFactory fabrica = cfg.buildSessionFactory();
             Session sessao = fabrica.openSession();
             Transaction tx_Customer = sessao.beginTransaction();

        Customer c = new Customer();
        Order o = new Order();
        
        o.setId(1);
        o.setNumber("1");
        o.setCustomer(c);

        o.setId(2);
        o.setNumber("2");
        o.setCustomer(c);
        


        List<Order> lista = new ArrayList();
        lista.add(o);

        c.setId(1);
        c.setOrders(lista);
        
             sessao.save(c);

             tx_Customer(.commit();
             sessao.close();
       
        } catch (Exception e) {
        }


    }
}

3 Respostas

F

Só para efeito de teste, você pode tentar usando um nome diferente de “Order” ? É que order é palavra reservada do sql então pode ser que o mysql esteja interpretando como um comando ao invés de uma tabela.

Eu não lembro qual é o default, mas pode ser necessário também configurar o cascade para persist, caso queira que ao salvar a entidade principal ele salve também as associadas. Caso contrário precisará salvar individualmente e só no final chamar o commit.

F

Você deve especificar a coluna de junção da tabela, no many-to-one.

@ManyToOne @JoinColumn(name="colunajuncao") public Customer getCustomer() { return customer; }

F

Só para explicar melhor…

Como você não avisou o Hibernate qual é a coluna que contem a FK, ele tentou o nome da entidade “costumer” mais “_” mais “id”. Tentando, então, “costumer_id”. Provavelmente não é essa a coluna FK, então você deve avisá-lo qual é através de @JoinColumn.

Criado 5 de setembro de 2011
Ultima resposta 6 de set. de 2011
Respostas 3
Participantes 3