Eclipselink + JPA意外生成ID列

时间:2011-04-06 14:54:36

标签: jpa eclipselink

Eclipselink生成了一个创建表语句,如下所示:

Create Table myTable (ID (255) not null, col1 (255), col2(255), col3(255) PK (ID, col1, col2)  



@Embeddable  
MyPK implements Serializable  
{  
    @OneToOne  
    @Id  
    String col1;  

    @OneToOne  
    @Id   
    String col2;    
...  
}  



@Entity  
MyClass implements Serializable  
{  
   @EmbeddedId  
   MyPK pk;  
   String col1;  
   String col2;  
   String col3;  
...  
}

如何阻止在ID语句中生成Create Table列?我问,因为em.persist(MyClass)抛出ID上的约束异常为空。我希望@EmbeddedId会覆盖它并阻止创建该字段。

修改
我试图在代码中生成的表格如下:

fk - col1  
fk - col2
VarChar  - col3

1 个答案:

答案 0 :(得分:2)

第一个问题是String属性不能是OneToOne映射。其次,OneToOne映射不能在EmbeddedId中使用。第三,你不在EmbeddedId中使用@Id注释,因为Embeddable不能拥有身份。

最简单的方法是:

@Entity
@IdClass(MyPK.class)  
MyClass implements Serializable  
{  
   @OneToOne
   @Id
   TargetClass rel1;

   @OneToOne
   @Id
   SecondTargetClass rel2

   @Basic
   String col3;  
...  
}

MyPK implements Serializable  
{  
    String rel1;  

    String rel2;    
...  
}  

如果你真的需要一个Embeddable用于pk类,那么用@MapsId替换@ID注释并在MyClass中添加EmbeddedId注释,并将Embeddable注释添加回MyPK