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/0/jpa/2.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
Hibernate保持单向一对多关系_Hibernate_Jpa_Hibernate Onetomany - Fatal编程技术网

Hibernate保持单向一对多关系

Hibernate保持单向一对多关系,hibernate,jpa,hibernate-onetomany,Hibernate,Jpa,Hibernate Onetomany,我有以下型号: 对应的映射如下所示: 报价实体 我遇到的问题是,我无法使用项目列表保留报价,这是我尝试执行此操作的代码: SessionFactory sessionFactory; Configuration configuration= new Configuration(); configuration.configure(); sessionFactory=configuration.buildSessionFactory(); Session session= sessionFacto

我有以下型号:

对应的映射如下所示:

报价实体

我遇到的问题是,我无法使用项目列表保留报价,这是我尝试执行此操作的代码:

SessionFactory sessionFactory;
Configuration configuration= new Configuration();
configuration.configure();
sessionFactory=configuration.buildSessionFactory();
Session session= sessionFactory.openSession();
session.beginTransaction();

Quote quote= new Quote();
quote.setNumber("ASR3E4E");

Set<Item> items= new HashSet<Item>();

Item item1= new Item();
item1.setName("Item 1");

Item item2= new Item();
item1.setName("Item 2");

items.add(item1);
items.add(item2);        

quote.setItem(items);

session.persist(quote);

session.getTransaction().commit();
鉴于上述情况,这让我觉得。。。如何使自动休眠能够将报价及其项目持久化。为什么hibernate不先生成报价的id,保存它,然后保存一个项目? 我应该如何进行映射以保持单向关系,并且我可以毫无问题地完成我正在尝试的事情

非常感谢

试试看

   item1.setQuote(quote);
   item2.setQuote(quote);
   session.persist(quote);
在您的情况下,不可能成功,因为您无法在此设置关系:如果:

移除级联=级联类型.ALL


映射问题中所示数据库模型的正确方法如下:

报价实体

以及保存带有项目的报价实体的代码:

SessionFactory sessionFactory;
Configuration configuration= new Configuration();
configuration.configure();
sessionFactory=configuration.buildSessionFactory();
Session session= sessionFactory.openSession();
session.beginTransaction();

Quote quote= new Quote();
quote.setNumber("ASR3E4E");

Set<Item> items= new HashSet<Item>();

Item item1= new Item();
item1.setName("Item 1");

Item item2= new Item();
item2.setName("Item 2");

items.add(item1);
items.add(item2);        

quote.setItem(items);

session.persist(quote);

session.getTransaction().commit();

Hibernate为灵活的代码提供了双面映射。 如果要从valued entityitem执行任何操作。 做正确的映射

1.java类

    @OneToMany(cascade = CascadeType.ALL, mappedBy="quote",fetch=FetchType.Eager)

private Set<Item> item;

非常感谢您的回答,但我想得到一个关于它的解释,例如,为什么item1.SetQuote如果项目没有QuoteItem1.SetQuote item是外键的持有者,包含quote的PK,因此您必须设置项目的关系。现在你正在做另一件事。由于您没有这样做,hibernate生成的insert SQL不包含指向quote的指针,因此违反了约束。我只是懒得纠正您的模型,所以让我们等待其他人为您这样做。您可以从private Quote;@Antoniossss Ok,原因是什么?因为普通模型会有Item->private Quote;这就是对象关系映射背后的全部目的和思想
   item1.setQuote(quote);
   item2.setQuote(quote);
   session.persist(quote);
session.persist(quote); // this must be done first to actually get bloody quote ID that you can propagate
item1.setQuoteId(quote.getId()); //or something to set quoteid
item2.setQuoteId(quote.getId())=quote.id; //or something to set quoteid
session.persist(item1);
session.persist(item2);
@Entity
@Table(name="Quote")
@Getter
@Setter
public class Quote {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name="idQuote")
    private int id;

    @Column(name="number")
    private String number;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "Quote_idQuote", nullable=false)
    private Set<Item> item;
}
@Entity
@Table(name="Item")
@Getter
@Setter
public class Item {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name="idItem")
    private int id;

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

}
SessionFactory sessionFactory;
Configuration configuration= new Configuration();
configuration.configure();
sessionFactory=configuration.buildSessionFactory();
Session session= sessionFactory.openSession();
session.beginTransaction();

Quote quote= new Quote();
quote.setNumber("ASR3E4E");

Set<Item> items= new HashSet<Item>();

Item item1= new Item();
item1.setName("Item 1");

Item item2= new Item();
item2.setName("Item 2");

items.add(item1);
items.add(item2);        

quote.setItem(items);

session.persist(quote);

session.getTransaction().commit();
    @OneToMany(cascade = CascadeType.ALL, mappedBy="quote",fetch=FetchType.Eager)

private Set<Item> item;
    @ManyToOne
    @JoinColumn(name="Quote_idQuote") 
    private Quote quote;