我正在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
是什么!
答案 0 :(得分:0)
您可以完全删除引用回Cart
,并通过从mappedBy="cart"
注释中删除@OneToMany
部分,使完整关系朝向一个方向。
如果你仍然希望项目中有cart_id
,你可以使用Cart
上的java代码设置它。
当然,所有这些都引出了一个问题:为什么你想要这种非JPA-ish的行为。如果您创建另一个问题,说明您的原始问题/关注点,则可能需要了解有关JPA的信息。