gpt4 book ai didi

java - 为什么 Hibernate 两次选择相同的列?

转载 作者:搜寻专家 更新时间:2023-11-01 00:53:18 25 4
gpt4 key购买 nike

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 列被选中了两次。

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

}

最佳答案

可能是因为这部分:

@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”揭示了一些(旧的)问题,所以我没有排除任何问题,但我找不到任何证据证明最近存在的问题。你能提供一个测试用例(使用嵌入式数据库)吗?

关于java - 为什么 Hibernate 两次选择相同的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3794520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com