在我当前的实现中,每个数据库表都有单独的实体类。我正在将JPA与eclipselink-2.5.2一起使用。这对我来说很好,但是在某些情况下,当数据量巨大时,它就会滞后。这就是为什么我决定开始使用@ Embedded,@ Embeddable和@EmbeddedId的原因。在执行此操作时,我遇到一个错误,这对我来说很奇怪。这是发布的完整堆栈跟踪:https://gist.githubusercontent.com/tjDudhatra/b955812e0d1a71cf97f1/raw/11ea458869e24baae744530417ac99bc877ed514/gistfile1.txt
具体来说,让我给您确切的情况,在这种情况下我会遇到异常(exception)。考虑具有三个类别的此代码块。一个注解为@Entity,另两个注解为@Embeddable。
我知道在一个类中我们无法定义@Id和@EmbeddedId,而我还没有做到这一点,所以在部署服务器时,我也得到了一个异常(exception),该异常(exception)仅表示:
@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;
....
}
请让我知道是否需要更多详细信息以及任何帮助,我们将不胜感激。
谢谢,
最佳答案
带注释的@Embeddable
的类不得包含任何@EmbeddedId
。@EmbeddedId
用于在另一个类中注释@Embeddable
类类型的字段,并将其标记为主键。
例子 :
@Entity
public class Project {
@EmbeddedId ProjectId id;
...
}
@Embeddable
Class ProjectId {
int departmentId;
long projectId;
...
}
编辑:就您而言,我认为您不希望
Phone
,也不希望Address
成为@Embeddable
。只需将它们标记为常规@Entity
即可。