2010-09-25 5 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=? 

Beachten Sie, dass die Spalten ID und DEPT zweimal ausgewählt sind.Warum wählt Hibernate dieselben Spalten zweimal aus?

@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; 
} 

AKTUALISIERT: Es absichtlich @GeneratedValue getan wurde auf Nicht-PK zu setzen. Wie auch immer, jetzt habe ich aktualisiert, wie Sie angegeben haben.

Ich habe Kopie kleistert die neuen Anfragen:

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=? 

ich seine immer noch die gleiche erraten.

Und hier sind die Tabellen:

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")) 

hier ist der Code -Ich Einfügen hier, wie es ist:

@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() { 
    } 

Und hier ist der Testfall:

@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

Haben Sie das Problem gelöst? Wenn ja, füge bitte eine Antwort hinzu. – Robert

Antwort

1

Wahrscheinlich wegen dieses Teils:

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

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

Hier stimmt etwas nicht, die GeneratedValue kann nicht auf eine nicht PK angewendet werden. Meinen Sie:

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

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

Wenn nicht, und wenn dies beabsichtigt ist, bitte Ihr Ziel erklären und zeigen Sie Ihre Tabelle (n).


Update: ich das Problem nicht reproduzieren kann. Ich kopiere eingefügt den Code, den Sie zur Verfügung gestellt und hier ist die Abfrage, die ich bekomme:

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

Funktioniert wie erwartet.

Eine Google-Suche auf "hibernate duplicate aliases" deckt einige (alte) Probleme auf, also schließe ich nichts aus, aber ich konnte keinen Beweis der kürzlich vorhandenen Probleme finden. Können Sie einen Testfall (unter Verwendung einer eingebetteten Datenbank) bereitstellen?

+0

Ich glaube es nicht, weil ich @GeneratedValue für eine Nicht-PK behalten habe. Ich habe nach anderen Entitäten gesucht. Hibernate macht das gleiche für fast alle meine Entitäten. – HanuAthena

+0

@HanuAthena Sie hatten 'deptNameInDeptEntity' als' Id' deklariert, während die gemappte Spalte kein Kandidat als PK ist. Dies kann nicht funktionieren. Bitte zeigen Sie den * aktuellen * Code und die * aktuelle * Tabelle an. Sie machen etwas falsch (und ich schließe einen globalen Fehler nicht aus). –

+0

Vielen Dank für die Antwort :) Mein Bad, ich hätte den neuen Code geschrieben, während ich aktualisiert habe. Jetzt habe ich alles gelegt. Es ist immer noch das Gleiche. – HanuAthena

Verwandte Themen