我正在使用java持久性来保存与另一个实体关联的实体列表。以下是我遇到问题的简要说明。
@Entity public class Offer implements Serializable {
@Id private Long offerId;
@OneToMany
@Column List<OfferCategory> offerCategories;
}
@Entity public class OfferCategory implements Serializable {
@Embeddable public static class Id implements Serializable
{
@Column(name="offer_id")
private Long offerId;
@Column(name="category_id")
private Long categoryId;
public Id() {}
public Id(Long offerId, Long categoryId) {
this.offerId = offerId;
this.categoryId = categoryId;
}
public boolean equals(Object o) {
if(o != null && o instanceof Id) {
Id other = (Id) o;
return this.offerId.equals(other.offerId) &&
this.categoryId.equals(other.categoryId);
}
else
return false;
}
public int hashCode() {
return offerId.hashCode() + categoryId.hashCode();
}
}
@EmbeddedId private Id id = new Id();
}
基本上,由于我无法更改架构,我需要将类别列表保存为分配给要约。
现在,我从用户那里获得一个类别列表,然后将它们放入Offer的offerCategories字段中。但是,这不适用于新优惠,因为我无法设置新商品的ID。
我是JPA和Seam的新手,所以如果有人能给我一个正确方向的推动,我们将不胜感激。
答案 0 :(得分:0)
我之前没有尝试使用复合ID,但需要注意的一点是@Column仅用于更改字段正在使用的数据库列的属性。它没有规定关系,所以你仍然需要这样的东西:
@OneToMany
List<OfferCategory> offerCategories;
答案 1 :(得分:0)
当我查看教程时,我发现了this:
您无法使用IdentifierGenerator生成复合键。相反,应用程序必须分配自己的标识符。
所以你必须自己分配id。也许你可以创建一个数据库序列并使用本机查询获取其值? 还有一句话 - 如果你想使用List映射(Offer中的Categories的顺序是由数据库定义的),你需要一个索引列来包含列表中的索引。如果类别的顺序不重要,Set会更方便。
答案 2 :(得分:0)
好吧,我现在的解决方案是我坚持每一个(为新条目创建密钥),然后将它们填入一个列表,然后将它们填充到它们的容器对象中,然后保留该对象。