gpt4 book ai didi

java - 当反向引用只是一个 id 属性而不是完整引用时如何执行 OneToMany Hibernate 映射

转载 作者:行者123 更新时间:2023-11-29 06:11:31 25 4
gpt4 key购买 nike

让我更具体一点,很难在标题中描述这一点。

我有一个名为 Bucket 的类,它有一个到一系列标签的映射。 Bucket 类有一个 id 属性。 Label 类没有对 Bucket 的引用,而是有一个 bucketId 字段,其中包含拥有的桶的 ID。为了允许将 Bucket 对象转换为 JSON 表示法,这是避免循环引用(Bucket 到 Label 和返回 Label 到 Bucket)所必需的。

我的 Bucket 类如下所示:

@Entity(name="Bucket")
@Table(name = "BUCKETS")
public class Bucket implements Serializable {

@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "BUCKET_ID")
protected long id;

/*
* Map of labels indexed by the label name. I'm not sure this mapping is correct!
*/
@ElementCollection
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@MapKeyColumn(name="LABEL_NAME")
private Map<String, Label> labels = new HashMap<String, Label>();

...

}

Label 类如下所示:

@Entity(name="Label")
@Table(name = "LABELS")
public class Label implements Serializable {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "LABEL_ID")
protected long id;

/*
* How do I map this? It should point to the id of the Bucket instance that has
* this label in its "labels" map
*/
protected long bucketId;


@Column(name = "LABEL_NAME", length=250, nullable=false)
private String name;

...

}

如果我可以在标签中有一个 Bucket 引用,我会将其映射为 @OneToMany,然后在 Buckets 类中我将映射为 @ManyToOne(mappedBy="bucket"),但我没有该引用, 只是指向后面的 id。

有人知道我该如何映射吗?

谢谢!爱德华多

最佳答案

@ElementCollection
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@MapKeyColumn(name="LABEL_NAME")
private Map<String, Label> labels = new HashMap<String, Label>();

首先上面的映射是不正确的。使用 @ElementCollection 或 @OneToMany,不能同时使用。

就 buckedId 字段的映射而言,我只是将其映射为 Labels 表中的普通 Long 字段。当您将标签添加到存储桶时,您可以使用正确的 bucketId 初始化该字段。像这样的东西(在 Bucket 类中):

public void addLabel(Label label) {
labels.put(label.getName(), label);
label.setBucketId(this.getId());
}

但是请确保 Labels 类中的 bucketId 字段不能设置为不正确的值。例如,您可以降低 bucketId 字段的 setter 的可见性。

关于java - 当反向引用只是一个 id 属性而不是完整引用时如何执行 OneToMany Hibernate 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6671074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com