2015-03-20 2 views
1

Я использую исключение ниже всякий раз, когда я использую сущность, которую я определил.org.hibernate.exception.SQLGrammarException: Недопустимое имя столбца

org.hibernate.exception.SQLGrammarException: Invalid column name 'coordinator_sycs_coord_id'. 
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122) 
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) 

Я буду публиковать нижестоящие объекты и запрос, который генерирует Hibernate. Контекст - это два объекта, которые имеют отношение «многие ко многим» в таблице ассоциаций. Мне интересно, что запрос, который генерирует Hibernate, меняет имя столбца, даже если у меня есть это в моих аннотациях. Смотрите ниже:

@Entity 
@Table(name = "sycs_coord") 
public class SycsCoordinator { 

    @Id 
    @GeneratedValue 
    @Column(name = "sycs_coord_id") 
    Long id; 

    @OneToMany(mappedBy = "club", fetch = FetchType.LAZY) 
    Set<SycsCoordinatorClub> clubs; 

    //Standard setters and getters below 
} 

@Entity 
@Table(name = "sycs_coord_clb") 
@IdClass(SycsCoordinatorClubPk.class) 
public class SycsCoordinatorClub { 

    @Id 
    @Column(name = "sycs_coord_id") 
    Long sycs_coord_id; 

    @Id 
    @Column(name = "clb_id") 
    String clb_id; 

    @ManyToOne 
    @PrimaryKeyJoinColumn(name = "sycs_coord_id", referencedColumnName="sycs_coord_id") 
    SycsCoordinator coordinator; 

    @ManyToOne 
    @PrimaryKeyJoinColumn(name = "clb_id", referencedColumnName = "Clb_id") 
    Club club; 

} 

Я не включая классы Club и SycsCoordinatorClubPk сейчас, потому что они, кажется, не имеет отношения к этой проблеме. Запрос, Hibernate генерирует несколько раз является:

select 
    clubs0_.club_Clb_Id as club4_0_3_, 
    clubs0_.clb_id_fk as clb1_3_, 
    clubs0_.sycs_coord_id as sycs2_3_, 
    clubs0_.clb_id_fk as clb1_2_2_, 
    clubs0_.sycs_coord_id as sycs2_2_2_, 
    clubs0_.club_Clb_Id as club4_2_2_, 
    clubs0_.coordinator_sycs_coord_id as coordina5_2_2_, 
    clubs0_.lst_updt_dt as lst3_2_2_, 
    clubs0_.sycs_coord_secur_grp_cd as sycs6_2_2_, 
    sycscoordi1_.sycs_coord_id as sycs1_0_0_, 
    sycscoordi2_.sycs_coord_secur_level_id as sycs4_3_1_ 
from 
    sycs_coord_clb clubs0_ 
left outer join 
    sycs_coord sycscoordi1_ 
     on clubs0_.coordinator_sycs_coord_id=sycscoordi1_.sycs_coord_id 
where 
    clubs0_.club_Clb_Id=? 

Обратите внимание, что иногда имя столбца coordinator_sycs_coord_id появляется в запросе, даже если нет такого имени ни в одной из аннотаций. Почему это?

ответ

1

Вы неправильно используя @PrimaryKeyJoinColumn аннотацию, отсюда и странные результаты:

Он используется, чтобы присоединиться к основной таблице подкласса объекта в соединенной стратегии отображения на основную таблицу суперкласса; это , используемый в аннотации SecondaryTable для присоединения к вторичной таблице к первичной таблице ; и он может использоваться в сопоставлении OneToOne, в котором первичный ключ ссылочного объекта используется в качестве внешнего ключа к объекту, на который ссылается .

http://docs.oracle.com/javaee/5/api/javax/persistence/PrimaryKeyJoinColumn.html

Вы, вероятно, следует с помощью @JoinColumn вместо:

@JoinColumn(name = "sycs_coord_id", referencedColumnName = "sycs_coord_id") 
+0

Я проверю ответ принять, как только я могу это исправить. Большое спасибо. –

+0

Это сработало. Я должен был также добавить 'updatable = false, insertable = false'. Большое спасибо. –

Смежные вопросы