Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring JPA-多对一,无完整异物_Java_Hibernate_Spring Mvc_Spring Data Jpa - Fatal编程技术网

Java 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

我正在试用spring和jpa的
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]