【问题标题】:Hibernate Problem, a Map with an Object as a Key and an Integer as a ValueHibernate 问题,以对象为键、整数为值的映射
【发布时间】:2020-04-28 17:39:01
【问题描述】:

我正在尝试在我的“购物”应用中为商品添加数量功能。我有一个 Order 对象,它有一个 Map,其中的键是 Case 对象(如音乐设备的外壳),以及值他们的密钥存储是整数,表示按顺序排列的这些案例的数量。

之前,Orders 在 @OneToMany 关系中只有 ListCases,它运行良好,保存到 DB 没有任何问题(没有数量功能)。 OrderCase 对象有表格,并且是双向连接的。

现在我想添加一个 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


【解决方案1】:

试试这个:

订购

@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

【讨论】:

  • 还是一样的异常。我不明白为什么案件会有订单清单。我假设大多数案例将是唯一对象(客户指定其确切参数),因此案例仅属于一个订单。我会检查你提供的来源。
  • java2s 的解决方案似乎正是我的情况,但它不起作用。还是一样的例外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多