0

クラス ClassA とクラス ClassB があるとします。ClassA は、OneToManny 依存関係を持つ List への参照を維持し、アプリケーションによって設定された ID を持っています。ClassB には ClassA への参照がありません。依存関係は一方向です。

JPA Entity ごとに ID が必要なので、ClassB の ID を指定する必要がありますが、ClassB の ID は ClassA の ID と ClassB の ID から構成されます。ClassB から ClassA への参照を追加せずにこれをモデル化する方法はありますか (この場合、@ManyToOne と @JoinColumn を使用できることはわかっています)。

編集

@Embeddableandを使用しようとしています@ElementCollectionが、AnnotationException: List/array has to be annotated with an @OrderColumn (or @IndexColumn): my.package.PoiDetails.tips.

完全なコードは次のとおりです ( PoiDetailsasClassAおよびCommentas を使用ClassB)。Comment主キーはUserの id、Commentのタイムスタンプ、の id の組み合わせであると想定できますPoi

クラス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;
}
}

ポイ:

@Entity
public class Poi implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private long id;
@Id
private long categoryId;
@Id
private long providerId;

private String title;

private String description;

private String positionLat;

private String positionLong;

private String positionAlt;

public Poi(){}

public Poi(long id, String title, String description, String positionLat, String positionLong, String positionAlt) {
    this(id, -1, title, description, positionLat, positionLong, positionAlt);
}

public Poi(long id, long categoryId, String title, String description, String positionLat, String positionLong, String positionAlt) {
    this.id = id;
    this.categoryId=categoryId;
    this.title = title;
    this.description = description;
    this.positionLat = positionLat;
    this.positionLong = positionLong;
    this.positionAlt = positionAlt;
}

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getDescription() {
    return description;
}
public void setDescription(String description) {
    this.description = description;
}
public String getPositionLat() {
    return positionLat;
}
public void setPositionLat(String positionLat) {
    this.positionLat = positionLat;
}
public String getPositionLong() {
    return positionLong;
}
public void setPositionLong(String positionLong) {
    this.positionLong = positionLong;
}
public String getPositionAlt() {
    return positionAlt;
}
public void setPositionAlt(String positionAlt) {
    this.positionAlt = positionAlt;
}

public long getCategoryId() {
    return categoryId;
}

public void setCategoryId(long categoryId) {
    this.categoryId = categoryId;
}

public long getProviderId() {
    return providerId;
}

public void setProviderId(long providerId) {
    this.providerId = providerId;
}
}

そしてユーザー:

@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;
}

}
4

1 に答える 1

1

ManyToOne を追加することが最善の解決策です。

外部キー フィールドに Basic を追加することもできますが、これは適切な設計ではありません。

もう 1 つの方法は、ClassB を Embeddable としてマップし、ElementCollection マッピングを使用することです。

http://en.wikibooks.org/wiki/Java_Persistence/ElementCollectionを参照してください 。

于 2013-07-08T13:25:32.227 に答える