0

一旦你看到我在代码块中发布的复合键和使用它们的实体,请参考我需要在数据库中为地址实体提供的下一个伪表:

地址表:

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是一个enum

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

映射错误在哪里?

先感谢您!

4

3 回答 3

0

我无法直接回答你的问题。但是,这里有一个可能会有所帮助的观察结果:

我认为您的数据库架构在映射到 Java 之前需要工作。以下是一些建议:

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

2:主键通常以表名命名,后跟ID(永远不要只使用'ID'作为名称)。

示例:地址addressID long primaryKey

3:你称为主键的其他字段可能应该是引用其他表的主键的外键(在其后键入长ID)。

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

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

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

7:您需要确定哪些列是唯一的且不可为空。

您可以联系您友好的邻居数据库管理员以帮助创建您的数据库架构。

于 2013-10-29T17:58:49.657 回答
0

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

像这样:

@Id
@Enumerated(EnumType.STRING)
private DocumentType  documentType;
于 2013-10-29T15:53:49.570 回答
0

address 的派生 id 必须包含来自 person 的 id,这是文档而不是其组件。 http://wiki.eclipse.org/EclipseLink/Development/JPA_2.0/mappedbyid显示了一些示例,但更多地针对嵌入式,但 idclass 的概念是相同的。尝试

public class AddressId implements Serializable {
    private Document person;
    private String   alias;
于 2013-10-30T06:00:07.767 回答