2010-09-25 20 views
5
Hibernate: 
    /* load entities.Department */ select 
     department0_.name as name4_0_, 
     department0_.id as id4_0_ 
    from 
     J_DEPT department0_ 
    where 
     department0_.name=? 
Hibernate: 
    /* load one-to-many entities.Department.employees */ select 
     employees0_.dept as dept4_1_, 
     employees0_.id as id1_, 
     employees0_.id as id5_0_, 
     employees0_.dept as dept5_0_, 
     employees0_.name as name5_0_ 
    from 
     J_EMP employees0_ 
    where 
     employees0_.dept=? 

Tenga en cuenta que las columnas ID y DEPT se seleccionan dos veces.¿por qué Hibernate selecciona las mismas columnas dos veces?

@Entity 
@Table(name = "J_EMP") 
public class Employee { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySeq") 
    @SequenceGenerator(name = "mySeq", sequenceName = "CNTRY_SEQ") 
    private Long id; 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "dept") 
    private Department deptNameInEmp; 
} 


@Entity 
@Table(name = "J_DEPT") 
public class Department { 

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySeq") 
    @SequenceGenerator(name = "mySeq", sequenceName = "CNTRY_SEQ") 
    private Long id; 

    @Id 
    @Column(name = "name") 
    private String deptNameInDeptEntity; 

    @OneToMany(mappedBy = "deptNameInEmp") 
    Set<Employee> employees; 
} 

Actualizado: fue hecho intencionalmente para poner @GeneratedValue en la no-PK. Sin embargo, ahora he actualizado según lo especificado.

tengo copia-pegar las nuevas consultas:

Hibernate: 
    /* load entities.Department */ select 
     department0_.id as id4_0_, 
     department0_.name as name4_0_ 
    from 
     J_DEPT department0_ 
    where 
     department0_.id=? 
Hibernate: 
    /* load one-to-many entities.Department.employees */ select 
     employees0_.dept as dept4_1_, 
     employees0_.id as id1_, 
     employees0_.id as id5_0_, 
     employees0_.dept as dept5_0_, 
     employees0_.name as name5_0_ 
    from 
     J_EMP employees0_ 
    where 
     employees0_.dept=? 

supongo que es siempre la misma.

Y aquí están las tablas:

CREATE TABLE "XYZ"."J_DEPT" 
    ( "ID" NUMBER(*,0) NOT NULL ENABLE, 
    "NAME" VARCHAR2(255 BYTE) NOT NULL ENABLE, 
    CONSTRAINT "J_DEPT_PK" PRIMARY KEY ("ID") 
) 

CREATE TABLE "XYZ"."J_EMP" 
    ( "ID" NUMBER NOT NULL ENABLE, 
    "NAME" VARCHAR2(255 BYTE), 
    "DEPT" NUMBER NOT NULL ENABLE, 
    CONSTRAINT "J_EMP_PK" PRIMARY KEY ("ID")) 

Aquí está el código de pegar -Estoy aquí, ya que es:

@Entity 
@Table(name = "J_DEPT") 
public class Department { 

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySeq") 
    @SequenceGenerator(name = "mySeq", sequenceName = "CNTRY_SEQ") 
    @Id 
    private Long id; 

    @Column(name = "name") 
    private String deptNameInDeptEntity; 

    @OneToMany(mappedBy = "deptNameInEmp") 
    Set<Employee> employees; 

    public Set<Employee> getEmployees() { 
     return employees; 
    } 
} 



@Entity 
@Table(name = "J_EMP") 
public class Employee { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySeq") 
    @SequenceGenerator(name = "mySeq", sequenceName = "CNTRY_SEQ") 
    private Long id; 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "dept") 
    private Department deptNameInEmp; 

    public Employee() { 
    } 

Y aquí es el caso de prueba:

@RunWith(SpringJUnit4ClassRunner.class) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) 
@ContextConfiguration(locations = { "classpath:test-applicationContext.xml" }) 
@Transactional 
public class EmpTest { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Test 
    public void testDept() { 
     final Department find = (Department) sessionFactory.getCurrentSession() 
       .get(Department.class, Long.parseLong("1")); 
     System.out.println("find res = " + find); 
    } 

} 
+1

¿Ha resuelto el problema? Si es así, por favor agregue una respuesta. – Robert

Respuesta

1

Probablemente debido a esta parte:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySeq") 
@SequenceGenerator(name = "mySeq", sequenceName = "CNTRY_SEQ") 
private Long id; 

@Id 
@Column(name = "name") 
private String deptNameInDeptEntity; 

Hay algo mal aquí, el GeneratedValue no se puede aplicar a un PK no. Quiso decir:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySeq") 
@SequenceGenerator(name = "mySeq", sequenceName = "CNTRY_SEQ") 
private Long id; 

@Column(name = "name") 
private String deptNameInDeptEntity; 

De lo contrario, y si esto fue intencionado, explíquenos su objetivo y muestre su (s) tabla (s).


Actualización: No puedo reproducir el problema. Copié pegado el código que proporcionó y aquí está la consulta que obtengo:

select 
    employee37x0_.id as id135_, 
    employee37x0_.dept as dept135_, 
    employee37x0_.name as name135_ 
from 
    J_EMP employee37x0_ 
where 
    employee37x0_.id=? 

Funciona como se esperaba.

Una búsqueda en Google en "hibernate duplicate aliases" revela algunos (antiguos) problemas, por lo que no excluyo nada, pero no pude encontrar ninguna prueba de problemas recientes. ¿Puede proporcionar un caso de prueba (utilizando una base de datos integrada)?

+0

No creo que sea porque he guardado @GeneratedValue para un PK no. He verificado otras entidades Hibernate está haciendo lo mismo para casi * todas * mis entidades. – HanuAthena

+0

@HanuAthena Tuviste 'deptNameInDeptEntity' declarado como' Id' mientras que la columna mapeada no es candidata como PK. Esto no puede funcionar. Por favor, muestre el código * actual * y la tabla * actual *. Estás haciendo algo mal (y no excluyo un error global). –

+0

Gracias por la respuesta :) My Bad, podría haber publicado el código NEW mientras lo actualizaba. Ahora coloqué todo. Sigue siendo el mismo – HanuAthena

Cuestiones relacionadas