引用类中id为的JPA实体

引用类中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

假设我有一个a班和一个B班。ClassA维护对具有OneToManny依赖项的列表的引用,并由应用程序设置id。ClassB没有对ClassA的引用。依赖是单向的

因为每个JPA实体都需要一个Id,所以我必须为ClassB指定一个Id,但是ClassB的Id是由ClassA的Id和ClassB的Id组成的。有没有一种方法可以在不将ClassB的引用添加到ClassA的情况下对此进行建模(我知道在这种情况下我可以使用@manytone和@JoinColumn)

编辑

我试图使用
@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;
}

}