2013-03-18 252 views
0

我有以下实体类和另一类为复合主键org.hibernate.MappingException:在映射重复列实体

实体类

@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对象来更新它... – 2013-03-18 11:13:30

+0

@PierreHenry我已经试过SlNo只读,就像projectNo一样,但是这并没有解决问题。 – user75ponic 2013-03-18 12:41:33

回答

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

你为什么声明SlNoprojectNo领域的两倍?请从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

如果我从'Project'类中删除了'SlNo'和'projectNo',我该如何从其他类中引用这些字段,例如从DAO的“实体”类列? – user75ponic 2013-03-18 12:09:19

+0

我在DAO类中有以下谓词predicate = cb.equal( \t \t \t \t emp.get(Project_.projectNo),pexp);其中'Project_'是'metamodel'生成的类。因此,如果我从Project类中移除了'projectNo',它也会从Project_class中移除,我将无法引用为'Project_.projectNo'。 – user75ponic 2013-03-18 12:37:49

+0

为Project类中的字段添加委托获取者,或者看看我编辑的答案中发布的第二个解决方案 – overmeulen 2013-03-18 12:59:52

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 2013-03-18 14:55:43

+0

感谢您的报价。我会记住这一点。但是,只要在规范中,我认为我们应该是安全的。我们已经在我们的项目中使用了它,并没有问题。 – Sashi 2013-03-18 14:59:50

+0

@Sashi我得到了运行时异常'java.lang.IllegalStateException:在DAO中没有发现这个行的超类型''TypedQuery countquery = entityManager.createQuery(countQ);' – user75ponic 2013-03-18 15:08:09

1

它已经一段时间,解决了问题。你最后的代码似乎并不正确。您创建了一个复合键,但没有使用它。它应该是以下内容:

@Entity 
public class Project { 

    @EmbeddedId 
    private ProjectPK projectPK; 
    ... 

} 
相关问题