почему Hibernate выбирает одни и те же столбцы дважды? - PullRequest
5 голосов
/ 25 сентября 2010
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=?

Обратите внимание, что столбцы ID и DEPT выбираются дважды.

@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 Ответ

1 голос
/ 25 сентября 2010

Вероятно из-за этой части:

@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 дубликаты псевдонимов " обнаруживает некоторые (старые) проблемы, поэтому я ничего не исключаю, но не смог найти никаких доказательств недавних существующих проблем. Можете ли вы предоставить контрольный пример (используя встроенную базу данных)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...