gpt4 book ai didi

java - Hibernate 问题,一个以对象为键、以整数为值的映射

转载 作者:行者123 更新时间:2023-12-01 18:54:02 28 4
gpt4 key购买 nike

我正在尝试为我的“购物”应用中的商品添加数量功能。我有一个 Order 对象,它有一个 Map ,其中的键是 Case 对象(如音乐设备的案例),以及值它们存储的 key 是​​整数,代表该订单中这些案例的数量。

之前,订单只有@OneToMany关系中的案例列表,并且工作正常,保存到数据库没有任何问题(无数量功能)。 OrderCase 对象具有表,并且是双向连接的。

现在我想添加一个连接表,其中包含 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;

最佳答案

试试这个:

订单

@Proxy(lazy=false)  // test
@Table(name="orders")
public class Order {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;

@ElementCollection
@CollectionTable(name="quantities",
joinColumns = {@JoinColumn(name="Order_id")}
)
@MapKeyJoinColumn(name="Case_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;

(...)

@ManyToMany(cascade= {CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.DETACH, CascadeType.REFRESH})
@JoinTable(name="quantities",
inverseJoinColumns = {@JoinColumn(name="order_id", referencedColumnName="id")}
,
joinColumns = {@JoinColumn(name="case_id", referencedColumnName="id")}
)
private List<Order> order;

来源:

https://docs.oracle.com/javaee/7/api/javax/persistence/MapKeyJoinColumn.html

http://www.java2s.com/Tutorials/Java/JPA/0320__JPA_ElementCollection_MapKeyEntity.htm

关于java - Hibernate 问题,一个以对象为键、以整数为值的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59692379/

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