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
答案 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