5

在我当前的实现中,每个 db 表都有单独的实体类。我正在使用 JPA 和 eclipselink-2.5.2。这对我来说很好,但在某些时候数据很大时,它会滞后。这就是我决定开始使用@Embedded、@Embeddable 和@EmbeddedId 的原因。这样做时,我遇到了一个对我来说很奇怪的错误。这是发布的完整堆栈跟踪:https ://gist.githubusercontent.com/tjDudhatra/b955812e0d1a71cf97f1/raw/11ea458869e24baae744530417ac99bc877ed514/gistfile1.txt

具体来说,让我给你一个确切的场景,在这种情况下我得到了例外。考虑这个具有三个类的代码块。一个被注释为@Entity,其他两个被注释为@Embeddable。我知道在一个类中我们不能定义 @Id 和 @EmbeddedId 并且我没有这样做,然后在部署服务器时,我得到一个异常,它只说:

[class org.apache.{SomeClass}] 有一个@EmbdeddedId(在属性[id] 上)和一个@Id(在属性[] 上)。不能在同一个实体上指定这两种ID 类型。

@Entity
@Table(name="user")  
public class User {

  @ID
  public Long id;

  @Column(name="userCode")
  public String userCode;

  @ElementCollection
  @CollectionTable(name = "address", joinColumns = @JoinColumn(name = "user_id"))
  public List<Address> addressList;

  ....
}

@Embeddable  
public class Address {

  @EmbeddedId
  @Column(name = "id")
  public Long id;

  @Column(name="userId")
  public Long userId;

  @Column(name="address-line-1")
  public String addressLine1;

  @Column(name="address-line-2")
  public String addressLine2;

  @ElementCollection
  @CollectionTable(name = "phone", joinColumns = @JoinColumn(name = "user_id"))
  protected List<Phone> phoneList;

  ....
}

@Embeddable 
public class Phone {

  @EmbeddedId
  @Column(name = "id")
  public Long id;

  @Column(name="contact_no")
  public String contactNo;

  @Column(name="country_code")
  public int countryCode;

  @Column(name="address_id")
  public int addressId;

  ....
}

如果需要更多详细信息,请告诉我,任何帮助将不胜感激。

谢谢,

4

2 回答 2

3

所以在这里我发现了问题。我做了一些分析,对embeddable和elementCollection有了更多的了解。这是参考:https ://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

所以现在我相应地修改了代码,它现在工作正常。这就是我使它工作的方式:

@Entity
@Table(name="user")  
public class User {

  @ID
  public Long id;

  @Column(name="userCode")
  public String userCode;

  @OneToMany(fetch = FetchType.EAGER)
  @JoinColumn(name = "user_id")
  public List<Address> addressList;

  ....
}

@Entity
@Table(name="address")  
public class Address {

  @Id
  @Column(name = "id")
  public Long id;

  @Column(name="userId")
  public Long userId;

  @Column(name="address-line-1")
  public String addressLine1;

  @Column(name="address-line-2")
  public String addressLine2;

  @OneToMany(fetch = FetchType.EAGER)
  @JoinColumn(name = "address_id")
  protected List<Phone> phoneList;

  ....
}

@Entity
@Table(name="phone")
public class Phone {

  @Id
  @Column(name = "id")
  public Long id;

  @Column(name="contact_no")
  public String contactNo;

  @Column(name="country_code")
  public int countryCode;

  @Column(name="address_id")
  public int addressId;

  ....
}
于 2015-10-16T06:52:42.323 回答
3

带注释的类@Embeddable不得包含任何@EmbeddedId.

@EmbeddedId就是在另一个类中注解一个class类型的字段,@Embeddable并将其标记为主键。

例子 :

@Entity
public class Project {
    @EmbeddedId ProjectId id;
    ...
}

@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
    ...
}

编辑:在你的情况下,我认为你不想Phone,也Address不想@Embeddable。只需将它们标记为常规@Entity

于 2015-10-15T07:18:06.530 回答