引用类中id为的JPA实体
假设我有一个a班和一个B班。ClassA维护对具有OneToManny依赖项的列表的引用,并由应用程序设置id。ClassB没有对ClassA的引用。依赖是单向的 因为每个JPA实体都需要一个Id,所以我必须为ClassB指定一个Id,但是ClassB的Id是由ClassA的Id和ClassB的Id组成的。有没有一种方法可以在不将ClassB的引用添加到ClassA的情况下对此进行建模(我知道在这种情况下我可以使用@manytone和@JoinColumn) 编辑 我试图使用引用类中id为的JPA实体,jpa,Jpa,假设我有一个a班和一个B班。ClassA维护对具有OneToManny依赖项的列表的引用,并由应用程序设置id。ClassB没有对ClassA的引用。依赖是单向的 因为每个JPA实体都需要一个Id,所以我必须为ClassB指定一个Id,但是ClassB的Id是由ClassA的Id和ClassB的Id组成的。有没有一种方法可以在不将ClassB的引用添加到ClassA的情况下对此进行建模(我知道在这种情况下我可以使用@manytone和@JoinColumn) 编辑 我试图使用@embeddebl
@embeddeble
和@ElementCollection
但是我得到了一个注释异常:列表/数组必须用@OrderColumn(或@IndexColumn)注释:my.package.PoiDetails.tips
以下是完整的代码(将PoiDetails
作为ClassA
和Comment
作为ClassB
)。您可以假设注释
主键是用户的id、注释
的时间戳和Poi
的id的组合
A类:
@Entity
public class PoiDetails implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@OneToOne
@JoinColumns(value = {
@JoinColumn(name="poiId", referencedColumnName="id"),
@JoinColumn(name="categoryId", referencedColumnName="categoryId"),
@JoinColumn(name="providerId", referencedColumnName="providerId")})
private Poi poi;
@Transient
private User[] peopleHere;
@ElementCollection
@CollectionTable(
name="tips"
)
private Comment[] tips;
@ElementCollection
@CollectionTable(
name="queries"
)
private Comment[] queries;
}
B类:
@Embeddable
public class Comment implements Serializable {
private static final long serialVersionUID = 1L;
private String text;
@OneToOne
@JoinColumn(name="userId")
private User user;
private long timestamp;
public Comment(String text, User user, long timestamp) {
super();
this.text = text;
this.user = user;
this.timestamp = timestamp;
}
public Comment(){}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Poi:
和用户:
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
private String nickname;
private String thumbnailUrl;
public User(){}
public User(String userId, String nickname){
this(userId, nickname, null);
}
public User(String id, String nickname, String thumbnailUrl) {
this.id=id;
this.nickname=nickname;
this.thumbnailUrl=thumbnailUrl;
}
public User(String userId) {
this.id=userId;
}
public String getId() {
return id;
}
public void setId(String userId) {
this.id = userId;
}
public void setNickname(String nickname) {
this.nickname=nickname;
}
public String getNickname() {
return nickname;
}
public String getThumbnailUrl() {
return thumbnailUrl;
}
public void setThumbnailUrl(String thumbnail) {
this.thumbnailUrl = thumbnail;
}
}
添加多通是最好的解决方案
您也可以为外键字段添加Basic,但这不是一个好的设计
另一种方法是将ClassB映射为可嵌入的和use and ElementCollection映射
看,,
我尝试使用Embeddeble和ElementCollection,但遇到了麻烦。请参见编辑。
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
private String nickname;
private String thumbnailUrl;
public User(){}
public User(String userId, String nickname){
this(userId, nickname, null);
}
public User(String id, String nickname, String thumbnailUrl) {
this.id=id;
this.nickname=nickname;
this.thumbnailUrl=thumbnailUrl;
}
public User(String userId) {
this.id=userId;
}
public String getId() {
return id;
}
public void setId(String userId) {
this.id = userId;
}
public void setNickname(String nickname) {
this.nickname=nickname;
}
public String getNickname() {
return nickname;
}
public String getThumbnailUrl() {
return thumbnailUrl;
}
public void setThumbnailUrl(String thumbnail) {
this.thumbnailUrl = thumbnail;
}
}