2017-04-05 2 views
0

私はネットで他のすべてのオプションを試しました。しかし、TicketsとMessagesテーブル(外部キーマップ)の両方に同時にレコードを挿入することができませんでした。なぜhibernateが子テーブルに挿入されないのですか?

何が間違っているのか分かりますか?コードを実行すると、チケットテーブルにのみレコードがあり、メッセージテーブルには記録されません。以下は

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>(); 

カスケード操作であることを指定する必要があります。

答えて

2

理由は、あなたのマッピングが持続操作をカスケード接続していないため、見ています非常に便利ですが、特に操作がMessageにカスケードされることを意図しないTicketを変更すると、潜在的な副作用に気をつけてください。

あなたは別途MessageTicketの永続状態を管理したい場合は、Message秒持続し、その後Ticketを永続化するために、ビジネス・ロジック・コードを変更する必要があると思います。

関連する問題