【发布时间】:2020-04-28 17:39:01
【问题描述】:
我正在尝试在我的“购物”应用中为商品添加数量功能。我有一个 Order 对象,它有一个 Map,其中的键是 Case 对象(如音乐设备的外壳),以及值他们的密钥存储是整数,表示按顺序排列的这些案例的数量。
之前,Orders 在 @OneToMany 关系中只有 List 的 Cases,它运行良好,保存到 DB 没有任何问题(没有数量功能)。 Order 和 Case 对象有表格,并且是双向连接的。
现在我想添加一个 Join Table,它由 Order_id、Case_id 和数量(订单中的一个案例)组成。我见过很多例子,但大多数都有一个简单的键,值作为对象(与我所拥有的相反),并且在大多数情况下,键指的是值的参数(这不是我的情况)。
目前我收到 org.hibernate.TransientObjectException,因为我没有保存 Case 对象。我什至可能没有正确映射它。对于如何在我的特定情况下使用注释,我很迷茫。代码如下:
订购
@Proxy(lazy=false) // test
@Table(name="orders")
public class Order {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
// @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@ElementCollection
@JoinTable(name="quantities",
joinColumns = {@JoinColumn(name="order_id", referencedColumnName="id")}
// ,
// inverseJoinColumns = {@JoinColumn(name="case_id", referencedColumnName="id")}
)
@MapKeyJoinColumn(name="case", referencedColumnName = "id")
@Column(name="quantity")
private Map<Case, Integer> cases;
(...)
案例
@Proxy(lazy=false)
@Table(name="cases")
public class Case {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
(...)
@ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.DETACH, CascadeType.REFRESH})
@JoinColumn(name="order_id")
private Order order;
【问题讨论】:
-
尝试使用复合键,这是联合表的某种扩展,因为在您的情况下,您的关系在表的外键旁边有一个额外的属性(数量)。在此处查看复合键部分:baeldung.com/jpa-many-to-many
标签: java sql hibernate annotations