我的课程看起来像这样:(提供课程)
@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&#39s时:
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.
我不知道为什么我不能在Set中保留两个可嵌入对象,当其中一个具有相同的&#34; amount&#34;领域?是否以某种方式将其视为ID?
也许我不应该创建可嵌入对象列表,因为它不是像这样设计的?如果是这样 - 那么如果我不需要产品的实体但又希望将其设置在另一个实体(Offer)中呢?
提前感谢您的帮助
答案 0 :(得分:0)
使用Set
时的问题是内容必须是唯一的,因为这是Set
的定义。 JPA提供程序将尝试使用数据库约束来强制执行此操作。在您的示例中,它以Primary Key
Offer_id
和int Amount
的形式添加约束,尽管恕我直言,它应该为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
解决此问题的方法是将products
属性Offer
设为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