[英]Properly Implementing a One to Many Unidirectional Relationship in Hibernate
[英]Hibernate Persist Unidirectional One To Many Relationship
我有以下模型:
對應的映射如下:
報價實體
@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")
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;
@Column(name="Quote_idQuote")
private int quoteId;
}
我的問題是我無法使用項目列表來保留Quote,這是我嘗試執行的代碼:
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: insert into Quote (number) values (?)
Hibernate: insert into Item (name, Quote_idQuote) values (?, ?)
Aug 09, 2018 3:27:25 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1452, SQLState: 23000
Aug 09, 2018 3:27:25 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Cannot add or update a child row: a foreign key constraint fails (`test`.`item`, CONSTRAINT `fk_Item_Quote` FOREIGN KEY (`Quote_idQuote`) REFERENCES `quote` (`idquote`))
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:831)
鑒於以上所述,這讓我開始思考...如何做到這一點,以便自動休眠可以將Quote及其項目持久化。 為什么不休眠首先生成Quote的ID,將其保留,然后再保留Items? 我應該如何進行映射以保持單向關系,並且我可以毫無問題地完成我想做的事情?
非常感謝!
映射問題中顯示的數據庫模型的正確方法如下:
報價實體
@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;
}
以及用於使用Quotes持久引用實體的代碼:
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提供了雙方映射,以實現靈活的代碼。 如果要從有價值的實體(項目)執行任何操作。 做正確的映射
1)Quote.java類
@OneToMany(cascade = CascadeType.ALL, mappedBy="quote",fetch=FetchType.Eager)
private Set<Item> item;
2)在Item.java類中
@ManyToOne
@JoinColumn(name="Quote_idQuote")
private Quote quote;
嘗試
item1.setQuote(quote);
item2.setQuote(quote);
session.persist(quote);
在您的情況下,無法成功,因為您無法在此處設置關系:如果滿足以下條件,它將起作用(並且仍然非常糟糕):
刪除級聯= CascadeType.ALL,
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.