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

Lưu ý rằng các cột IDDEPT được chọn hai lần.tại sao Hibernate chọn cùng một cột hai lần?

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

CẬP NHẬT: Nó được thực hiện cố ý đưa @GeneratedValue trên phi PK. Tuy nhiên, bây giờ tôi đã cập nhật như bạn đã chỉ định.

Tôi đã copy-dán các truy vấn mới:

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

Tôi đoán nó vẫn như nhau.

Và đây là các bảng:

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

đây là mã -i'm dán ở đây vì nó là:

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

Và đây là các trường hợp thử nghiệm:

@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

Bạn đã giải quyết được sự cố chưa? Nếu có, vui lòng thêm câu trả lời. – Robert

Trả lời

1

Có thể là do phần này:

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

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

Có gì đó sai ở đây, không thể áp dụng GeneratedValue cho một PK không. Ý của bạn là:

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

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

Nếu không, và nếu điều này là cố ý, vui lòng giải thích mục tiêu và hiển thị (các) bảng của bạn.


Cập nhật: Tôi không thể tạo lại sự cố. Tôi sao chép dán mã bạn đã cung cấp và đây là truy vấn tôi nhận được:

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

Làm việc như mong đợi.

Tìm kiếm của Google trên "hibernate duplicate aliases" tiết lộ một số vấn đề (cũ) nên tôi không loại trừ bất kỳ điều gì nhưng tôi không thể tìm thấy bằng chứng về các vấn đề hiện tại gần đây. Bạn có thể cung cấp một trường hợp thử nghiệm (sử dụng cơ sở dữ liệu nhúng) không?

+0

Tôi không nghĩ rằng nó vì tôi đã giữ @GeneratedValue cho một không PK. Tôi đã kiểm tra các thực thể khác. Hibernate đang làm tương tự cho gần như * tất cả * các thực thể của tôi. – HanuAthena

+0

@HanuAthena Bạn có 'deptNameInDeptEntity' được khai báo là' Id' trong khi cột được ánh xạ không phải là một ứng cử viên là PK. Điều này không thể làm việc. Vui lòng hiển thị mã * hiện tại * và bảng * hiện tại *. Bạn đang làm điều gì đó sai (và tôi không loại trừ một sai lầm toàn cầu). –

+0

Cảm ơn bạn đã trả lời :) My Bad, tôi có thể đã đăng mã MỚI trong khi tôi cập nhật. Bây giờ tôi đã đặt mọi thứ. Nó vẫn như cũ. – HanuAthena

Các vấn đề liên quan