Spring JPA - 多对一没有完整的异物

时间:2018-02-16 13:51:21

标签: java hibernate spring-mvc spring-data-jpa

我正在this repo尝试使用spring和jpa ManyToOne。实体之间的关系是一个Cart(购物车)可以有多个Item s(this tutorial之后)。

@Entity
@Table(name="CART")
public class Cart 
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cart_id")
    private long id;


    @OneToMany(mappedBy = "cart")
    private Set<Item> items;

    /* rest of class*/

物品

@Entity
@Table(name="ITEMS")
public class Item
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    @Column(name="item_name")
    private String itemName;

    @ManyToOne
    @JoinColumn(name = "cart_id", nullable = false)
    private Cart cart; // needs an entire Cart instance :(

     /* rest of class*/

问题

如何在不使Item类的整个Cart对象成为一部分的情况下将Cart映射到Item类。

我希望Item类看起来像这样

@Entity
@Table(name="ITEMS")
public class Item
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    @Column(name="item_name")
    private String itemName;


    @ManyToOne
    @JoinColumn(name = "cart_id", nullable = false)
    private long cartId; // just the ID of Cart, not the entire Cart object

这给出了错误

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.example.demo.Item.cartId references an unknown entity: long
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:97) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1752) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1696) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1583) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]

这并不让我感到惊讶。但我希望以某种方式能够在没有整个Item实例的情况下实例化Cart。理想情况下,只需将Cart ID作为Item中的字段即可。

修改

因此,如果我必须在Cart中使Item字段如何使用data-h2.sql脚本初始化数据库?没有SQL方法来表达Cart是什么!

1 个答案:

答案 0 :(得分:0)

您可以完全删除引用回Cart,并通过从mappedBy="cart"注释中删除@OneToMany部分,使完整关系朝向一个方向。

如果你仍然希望项目中有cart_id,你可以使用Cart上的java代码设置它。

当然,所有这些都引出了一个问题:为什么你想要这种非JPA-ish的行为。如果您创建另一个问题,说明您的原始问题/关注点,则可能需要了解有关JPA的信息。