gpt4 book ai didi

java - 为什么hibernate不插入子表?

转载 作者:行者123 更新时间:2023-12-02 02:55:08 25 4
gpt4 key购买 nike

我已经尝试了网上的所有其他选项。但无法同时在 Tickets 和 Messages 表(外键映射)中成功插入记录。

你能找出问题所在吗?当我运行代码时,我只在门票表中获取记录,而不是在消息表中获取记录。

下面是 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;
}

}

下面是测试()

 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

如果您想分别管理MessageTicket的持久化状态,您需要修改业务逻辑代码来持久化Message code>s,然后保留 Ticket

关于java - 为什么hibernate不插入子表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43222004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com