[英]Why hibernate does not insert in child table?
我已經嘗試過網絡上的所有其他選項。 但是無法同時在票證和消息表(映射的外鍵)中成功插入記錄。
您能確定出什么問題了嗎? 當我運行代碼時,我僅在門票表中而不是在消息表中獲取記錄。
以下是Ticket.class
@Entity
@Table(name = "ticket")
public class Ticket {
@Id
@Column(name = "ticket_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
int ticket_id;
@Column(name = "ticket_desc")
String ticket_desc;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "ticket")
Set<Message> message = new HashSet<Message>();
public int getTicket_id() {
return ticket_id;
}
public void setTicket_id(int ticket_id) {
this.ticket_id = ticket_id;
}
public String getTicket_desc() {
return ticket_desc;
}
public void setTicket_desc(String ticket_desc) {
this.ticket_desc = ticket_desc;
}
public Set<Message> getMessage() {
return message;
}
public void setMessage(Set<Message> message) {
this.message = message;
}
}
以下是Message.class
@Entity
@Table(name = "message")
public class Message {
@Id
@Column(name = "message_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int message_id;
@Column(name = "ticket_id")
private int ticket_id;
@Column(name = "message_text")
private String message_text;
@JoinColumn(name = "ticket_id", insertable = false, updatable = false)
@ManyToOne(cascade=CascadeType.ALL)
private Ticket ticket;
public Ticket getTicket() {
return ticket;
}
public void setTicket(Ticket ticket) {
this.ticket = ticket;
}
public int getMessage_id() {
return message_id;
}
public void setMessage_id(int message_id) {
this.message_id = message_id;
}
public int getTicket_id() {
return ticket_id;
}
public void setTicket_id(int ticket_id) {
this.ticket_id = ticket_id;
}
public String getMessage_text() {
return message_text;
}
public void setMessage_text(String message_text) {
this.message_text = message_text;
}
}
下面是test()
public static void test() {
Session session = HibernateSession.getHibernateSession();
Transaction t = session.beginTransaction();
Ticket ticket = new Ticket();
ticket.setTicket_desc("ticket description 2");
Set<Message> messages = new HashSet<Message>();
Message message = new Message();
message.setMessage_text("This is message text 2");
message.setTicket(ticket);
messages.add(message);
ticket.setMessage(messages);
session.persist(ticket);
t.commit();
}
您能確定出什么問題了嗎? 當我運行代碼時,我僅在門票表中而不是在消息表中獲取記錄。
原因是因為您的映射不會級聯持久性操作,請參見:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "ticket")
Set<Message> message = new HashSet<Message>();
如果您希望進行級聯操作,則需要指定
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "ticket")
Set<Message> message = new HashSet<Message>();
級聯操作非常有用,但是要注意它們的潛在副作用,尤其是如果您修改了Ticket
,而您不想將操作級聯到Message
。
如果要分別管理Message
和Ticket
的持久性狀態,則需要修改業務邏輯代碼以持久化Message
,然后持久化Ticket
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.