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;