2013-10-29 56 views
0

一旦你看到此组合键,并使用它们,我在代码块后下来的实体,请参考下pseudotable,我需要IdClass共享复合键在数据库的地址实体:JPA - 错误试图映射使用,而不是一个EmbeddedId

地址表:

ADDRESS 
------------------------------- 
DOCUMENTTYPE INT2   PK 
DOCUMENTNR  VARCHAR(10) PK 
ALIAS   VARCHAR(20) PK 
FULLADDRESS  VARCHAR(100) 
... 

实体&组合键:

@Embeddable 
public class Document implements Serializable { 
    private DocumentType documentType; 
    private String  documentNr; 
    ... 

@Entity 
@IdClass(Document.class) 
public class Person { 
    @Id 
    private DocumentType documentType; 
    @Id 
    private String  documentNr; 
    private String  fullName; 
    ... 

@Embeddable 
public class AddressId implements Serializable { 
    private DocumentType documentType; 
    private String  documentNr; 
    private String  alias; 
    ... 

@Entity 
@IdClass(AddressId.class) 
public class Address { 
    @Id 
    @ManyToOne 
    private Person  person; 
    @Id 
    private String  alias; 
    private String  fullAddress; 
    ... 

注意:DocumentType枚举

那么,我试图让地址实体的映射,但它不起作用,我不知道为什么。它一直说(EclipseLink),我有名称和类型不匹配的问题。我不明白为什么如果IdClass没有别名属性(当然也没有实体),那么它就像一个魅力,以及与完整的AddressId IdClass(与别名属性),但使用EmbeddedId。我需要的是像我发布的地址实体。

映射错误在哪里?

预先感谢您!

回答

0

我认为你必须添加@Enumerated(EnumType.STRING)enum

像这样:

@Id 
@Enumerated(EnumType.STRING) 
private DocumentType documentType; 
+0

感谢您的回应,但这不是因为枚举类型隐式地继承ORDINAL赋值。 –

0

我不能直接回答你的问题。但是,这里有一个观察,可以帮助:

我觉得你的数据库架构的工作需要你把它映射到Java前。下面是一些建议:

1:每一个数据库表中应该有一个且只有一个主键(通常是长型)和主键不应该有商业意义。任何地方都没有复合键由于没有组合键,您的原始问题不再是问题。

2:主密钥与ID表名后通常命名为后(从不使用只是“ID”作为名称)。

例子: 地址 addressID长的PrimaryKey

3:你叫主键也许应该是外键的其他字段(后他们ID long类型)引用了其他表的主键。

4:您需要正确地规范化您的数据库表。例如:'fullAddress'列可能应该分成streetAddress,city,stateID,countryID,zipcode。另一个例子:ADDRESS表应该只包含地址信息。为什么它有DOCUMENTTYPE?这与地址有什么关系?

5:应清楚地理解数据库表和列的名称。 “DOCUMENTNR”这一栏对我来说没有任何意义。

6:您的数据库表和列应该是nowns,并且它们通常应该映射到具有相同名称的java类。相反,你有一个名为AddressId的类,它显然映射到Address数据库表。将该类重命名为Address。

7:您需要决定哪些列是唯一的,而不是可以为空的。

您可以联系您的友好社区数据库管理员以获取帮助创建数据库模式的帮助。

+0

谢谢你的回应,但这不是我要找的。那些你推荐的东西我很感激,但它并没有回答我的问题(正如你在开头所说的那样)。这个问题我发布它只是JPA的映射问题,对于已经存在且我无法更改的数据库,该数据库已正常化并且这些组合ID是唯一的,并且需要如此,模式是好的,我只需要将它映射到JPA。再次感谢你! –