Hibernate持久化@Embeddable对象集抛出异常



我的类看起来与此类似:(提供类)

@Entity
public class Offer {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private int id;
    @ElementCollection(fetch = FetchType.LAZY)
    private Set<Product> products;
    ...other fields
}

产品类别:

@Embeddable
public class Product {
    private String name;
    private String description;
    private int amount;
}

问题是当我尝试持久化Offer实体并尝试向Offer的集合添加两个对象时:

Product product = new Product("ham", "description1", 1);
Product product = new Product("cheese", "description2", 1);

我收到异常:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "offer_products_pkey"
  Details: Key (offer_id, amount)=(1, 1) already exists.

我不知道为什么当其中一个具有相同值的"amount"字段时,我不能在集合中保留两个可嵌入对象?它是否以某种方式被视为身份证?

也许我不应该创建可嵌入对象的列表,因为它并不是这样设计的?如果是这样的话,如果我不需要一个实体的产品,但想把它放在另一个实体里(要约)怎么办?

提前感谢的帮助

使用Set时的问题是内容必须是唯一的,因为这是Set的定义。JPA提供程序将尝试使用数据库约束来强制执行这一点。在您的示例中,它以Primary KeyOffer_id和int Amount的形式添加了一个约束,尽管IMHO应该为Product属性的所有值添加一个约束。看到这一点的最好方法是启用SQL日志,并查看封面下发生了什么:

Hibernate: create table Offer (id integer not null, primary key (id))
Hibernate: create table Offer_products (Offer_id integer not null, amount integer not null, description varchar(255), name varchar(255), primary key (Offer_id, amount))
Hibernate: alter table Offer_products add constraint FKmveai2l6gf4n38tuhcddby3tv foreign key (Offer_id) references Offer

解决此问题的方法是将Offerproducts属性设置为List,而不是Set:

Hibernate: create table Offer (id integer not null, primary key (id))
Hibernate: create table Offer_products (Offer_id integer not null, amount integer not null, description varchar(255), name varchar(255))
Hibernate: alter table Offer_products add constraint FKmveai2l6gf4n38tuhcddby3tv foreign key (Offer_id) references Offer

相关内容

  • 没有找到相关文章

最新更新