Java Spring JPA-多对一,无完整异物
我正在试用spring和jpa的Java Spring JPA-多对一,无完整异物,java,hibernate,spring-mvc,spring-data-jpa,Java,Hibernate,Spring Mvc,Spring Data Jpa,我正在试用spring和jpa的ManyToOnein。实体之间的关系是一个购物车(购物车)可以有多个项目s(以下) 购物车 @Entity @Table(name="CART") public class Cart { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "cart_id") private long id; @OneToMany(mapped
ManyToOne
in。实体之间的关系是一个购物车(购物车)可以有多个项目s(以下)
购物车
@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 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]
这并不让我感到惊讶。但是我希望能够以某种方式实例化一个项目
,而不需要整个购物车
实例。理想情况下,只需将Cart
ID作为Item
中的字段即可
编辑
因此,如果我必须在Item
中创建Cart
字段,如何使用data-h2.sql
脚本初始化数据库?没有SQL方法来表示什么是Cart
只需从@OneToMany
注释中删除mappedBy=“Cart”
部分,即可完全删除对购物车的引用,并使整个关系朝一个方向运行
如果您仍然希望项目中包含cart\u id
,可以使用cart
上的java代码进行设置
当然,所有这些都回避了一个问题:为什么你想要这种行为,这是非常不符合JPA标准的。如果您创建了另一个问题来说明您的原始问题/顾虑,那么可能需要了解JPA。您还可以在项目上设置延迟抓取,即@OneToMany(mappedBy=“cart”,fetch=FetchType.lazy)
@manytone
用于引用对象而非原始类型,因此,我认为当您实例化一个项目时,您不会实例化Cart对象,为了解决这个问题,您可以使用延迟加载机制。在我看来,项目
除了自己的id
之外,只存储外键Cart\u id
。这就是建立关系所需要的一切。将整个购物车
对象放入项目
对我来说似乎没有必要,如果您更喜欢处理ID而不是JPA可能不是正确的选择。此外,短语“似乎不必要”意味着使用对象引用的额外成本。开发人员方面当然不存在这种成本。如果你在处理物品,你可能会把购物车装载到任何地方,因此,如果有一个参考资料的话,成本应该是最低的。
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]