簡體   English   中英

為什么休眠不插入子表中?

[英]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

如果要分別管理MessageTicket的持久性狀態,則需要修改業務邏輯代碼以持久化Message ,然后持久化Ticket

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM