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

請注意,IDDEPT列被選中兩次。爲什麼Hibernate兩次選擇相同的列?

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

更新: 它是故意把@GeneratedValue非PK。但是,現在我已經按照您的指定更新了。

我已經複製粘貼新的疑問:

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

我猜它仍然是相同的。

這裏是表:

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

這裏是這裏的代碼 - 我粘貼,因爲它是:

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

這裏是測試案例:

@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

你解決了這個問題嗎?如果是這樣,請添加答案。 – Robert 2016-03-08 23:18:08

回答

1

可能因爲此部分:

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

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

這裏有問題,GeneratedValue不能應用於非PK。您的意思是:

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

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

如果不是,如果這是故意的,請解釋您的目標並顯示您的表格。


更新:我無法重現該問題。我複製粘貼你提供的代碼,這裏是我得到的查詢:

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

按預期工作。

Google搜索「hibernate duplicate aliases」揭示了一些(舊)問題,所以我不排除任何東西,但是我找不到任何近期存在的問題的證據。你能否提供一個測試用例(使用嵌入式數據庫)?

+0

我不認爲這是因爲我已經爲一個非PK保留了@GeneratedValue。我檢查過其他實體。對於幾乎所有*我的實體,Hibernate都是這樣做的。 – HanuAthena 2010-09-25 19:18:27

+0

@HanuAthena您已將'deptNameInDeptEntity'聲明爲'Id',而映射列不是PK的候選人。這是行不通的。請顯示*當前*代碼和*當前*表格。你做錯了什麼(我不排除一個全球性的錯誤)。 – 2010-09-25 19:30:54

+0

謝謝你的回覆:)我的壞,我可以發佈新代碼,而我更新。現在我已經放置了一切。它仍然是一樣的。 – HanuAthena 2010-09-25 19:42:36

相關問題