2013-03-18 3 views
0

У меня есть следующий класс Entity и другой класс для составных первичных ключейorg.hibernate.MappingException: Повторный столбец отображения для объекта

Entity класс

@Entity 
@Table(name = "PROJECTS") 
public class Project { 
private Integer SlNo; 
private Long projectNo; 
private Date projectDate; 

@EmbeddedId 
ProjectPK projectPK; 

Первичного ключ класса

public class ProjectPK implements Serializable { 

private Integer SlNo; 
@Column(name = "project_no", insertable = false, updatable = false) 
private Long projectNo; 

public ProjectPK(){ 
} 
// with getters and setters and equals and hashCode implementation 

Проблема: я получаю следующие исключения

:org.hibernate.MappingException:Repeated column in mapping for entity 
: test.Project column: projectNo (should be mapped with 
insert="false" update="false") 

Я добавил следующее в Project Entity классе, но я получаю такое же исключение

@Column(name = "project_no", insertable = false, updatable = false) 

Редактировать 1

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 

CriteriaQuery<Long> countQ = cb.createQuery(Long.class); 
Root<Project> empCount = countQ.from(Project.class); 
countQ.select(cb.count(empCount)); 

TypedQuery<Long> countquery = entityManager.createQuery(countQ);// error in this line 
+1

Я думаю, что вы должны сделать SlNo только для чтения. Вы все еще можете прочитать его в своем коде, но вам придется использовать объект ProjectPK для его обновления ... –

+0

@PierreHenry Я пробовал SlNo читать только как projectNo, однако это не решило проблему. – user75ponic

ответ

0

я решил проблему, следующим образом

@Entity 
@Table(name = "PROJECTS") 
public class Project { 
@Column(name = "SL_NO" , insertable = false, updatable = false) 
private Integer SlNo; 
@Column(name = "PROJECT_NO" , insertable = false, updatable = false) 
private Long projectNo; 
private Date projectDate; 

@EmbeddedId 
ProjectPK projectPK; 

и первичного ключа класса

@Embeddable 
public class ProjectPK implements Serializable { 
@Column(name = "SL_NO") 
private Integer SlNo; 
@Column(name = "PROJECT_NO") 
private Long projectNo; 

//with hashCode and equals implementation 
3

Почему вы объявляющий SlNo и projectNo поля дважды? Просто удалите их из класса Project, и все должно быть хорошо.

Или, еще лучше, удалить ProjectPK класс и изменить Project класс следующим образом (обратите внимание, что этот метод работает только с Hibernate):

@Entity 
@Table(name = "PROJECTS") 
public class Project implements Serializable { 

    @Id 
    private Integer SlNo; 

    @Id 
    private Long projectNo; 

    private Date projectDate; 
} 
+0

Если я удаляю 'SlNo' и' projectNo' из класса 'Project', как я могу ссылаться на эти поля из другого класса, например. из DAO для столбцов класса Entity? – user75ponic

+0

У меня есть следующие в DAO класса 'предиката предикат = cb.equal ( \t \t \t \t emp.get (Project_.projectNo), Pexp);' где '' Project_' является metamodel' сгенерированный класс. Поэтому, если я удаляю «projectNo» из класса Project, он также удаляется из класса Project_, и я не буду ссылаться на «Project_.projectNo». – user75ponic

+0

Добавить делегат-получатели для этих полей в классе Project или взглянуть на второе решение, которое я опубликовал в моем отредактированном ответе – overmeulen

1

Чтобы достичь желаемого поведения, вы можете использовать @ IdClass аннотацию, как показано ниже -

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

Вот измененный код -

@Entity 
@Table(name = "PROJECTS") 
@IdClass(ProjectPK.class) 
public class Project { 
    @Id 
    private Integer SlNo; 

    @Id 
    private Long projectNo; 

    private Date projectDate; 
} 


public class ProjectPK implements Serializable { 

    @Column(name="sl_no") 
    private Integer SlNo; 

    @Column(name = "project_no") 
    private Long projectNo; 
} 
+0

Цитата из документации Hibernate: «Этот подход унаследован от EJB 2 дня, и мы рекомендуем его использовать. все это ваше приложение, и Hibernate поддерживает его ». – overmeulen

+0

Спасибо за цитату. Я буду помнить об этом. Но, пока это в спецификации, я думаю, что мы должны быть в безопасности. Мы использовали его в нашем проекте и не испытывали никаких проблем. – Sashi

+0

@Sashi Я получаю исключение во время выполнения 'java.lang.IllegalStateException: никакой супертип не найден в этой строке в DAO' TypedQuery countquery = entityManager.createQuery (countQ); ' – user75ponic

1

Это было какое-то время. Ваш последний код кажется неправильным. Вы создали составной ключ, но не использовали его. Это должно быть следующее:

@Entity 
public class Project { 

    @EmbeddedId 
    private ProjectPK projectPK; 
    ... 

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

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