JPA:映射ManyToMany关系引用了不正确的列名 [英] JPA: Mapping ManyToMany relationship refers to incorrect column name

查看:104
本文介绍了JPA:映射ManyToMany关系引用了不正确的列名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题与我昨天问的上一个问题有关. 我在Employee和SkillSet表之间有多对多关系,每个关系都有额外的列numberOfYears

This question is related to previous question that I asked yesterday. I have many-to-many relationship between Employee and SkillSet table, with additional column numberOfYears for each relation

employeeId  skillSetId  numberOfYears 
10          101         2

由于我在EmployeeSkillSet表中没有ID列,因此我正在使用@IdClass定义组合键

Since I do not have ID column in EmployeeSkillSet table, I am using @IdClass to define the composite key

@Entity
class Employee {
    private @Id Long id;
    @OneToMany(mappedBy="employeeId")
    private List<EmployeeSkillSet> skillSets;
}
class SkillSet {
    private @Id Long id;
}

@IdClass(EmpSkillKey.class)
@Entity
class EmployeeSkillSet {
    @Id 
    @Column("employee_id")
    private Long employeeId;
    @Id
    @Column("skill_id")
    private @Id Long skillId;

    @ManyToOne  
    private Employee employee;
    private int numberOfYears;
}

class EmpSkillKey{
   private int employeeId;
   private int skillId;
}


interface EmployeeRepository extends JPARepository{
   List<Employee> getEmployeesBySkillSetSkillId(long id);
}

上述JPA信息库方法可以正常工作,并根据skillSet ID为我提供了Employees列表.但是,当我尝试遍历列表并获取EmployeeSkillSet对象时,它将引发错误,因为它尝试映射到错误的列employee而不是employeeId.

The above JPA repository method works fine and gives me list of Employees as per the skillSet ID. But when I try to iterate over the list and get the EmployeeSkillSet object then it throws error, as it tries to map to incorrect column employee instead of employeeId.

List<Employee> emps = employeeRepository.getEmployeesBySkillSetSkillId(101);
for(Employee e: emps){  // this line throws error
  EmployeeSkillSet  ess = e.getEmployeeSkillSet();
  int n = ess.getNumberOfYears();
}

生成的查询是这样的. (我已将其转换为Employee用例,无法共享实际查询)

Query generated is something like this. (I have converted it to Employee use case, cannot share actual query)

select ud.employee_id , ud.employee_id , ud.employee , ud.employee_value , rd.employee_id 
 from employee_skill_set ud left outer join employee rd 
 on ud.employee=rd.employee_id 
 where ud.employee_id=?

例外

WARN  - SqlExceptionHelper         - SQL Error: 207, SQLState: ZZZZZ
ERROR - SqlExceptionHelper         - Invalid column name 'employee'.
org.hibernate.exception.GenericJDBCException: could not extract ResultSet
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:449)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:202)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:137)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102)
    at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:100)
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:693)
    at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:92)
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1933)
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:559)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:261)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:555)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:143)
    at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:294)

可能是我无法在同一类中定义@Id employeeId@ManyToOne employee.但是那怎么解决呢?

May be I cannot define @Id employeeId and @ManyToOne employee in same class. But then how to resolve this?

推荐答案

没关系,我找到了解决方案.用@JoinColumn和实际的列名注释@ManyToOne关系.不知道为什么要求将updatableinsertable设置为false.必须弄清楚我的基础知识:)

Nevermind, I found out the solution. Annotated the @ManyToOne relation with @JoinColumn and with actual column name. Not sure why it asked for making updatable and insertable as false. Have to get my basics clear :)

@IdClass(EmpSkillKey.class)
@Entity
class EmployeeSkillSet {
    @Id 
    @Column("employee_id")
    private Long employeeId;
    @Id
    @Column("skill_id")
    private @Id Long skillId;

    @JoinColumn(name="employee_id", insertable=false, updatable=false)
    @ManyToOne  
    private Employee employee;
    private int numberOfYears;
}

这篇关于JPA:映射ManyToMany关系引用了不正确的列名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆