2015-06-03 3 views
1

У меня есть следующий простой пример. Когда он запускается, я вижу, что объект QuoteRequest генерируется с автогенерированным идентификатором. Далее, я вижу Аварии объект генерируется, но quote_request_id, который вставляется пустой, так что я получаю сообщение об ошибке:Hibernate @OneToMany пытается вставить нуль

Column «quote_request_id» не может быть пустым

@Entity 
@Table(name = "Quotes") 
public class QuoteRequest 
{ 
    public QuoteRequest(){} 

    @Id 
    @Column(name = "quote_request_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long QuoteRequestId; 


    @OneToMany(mappedBy = "quoteRequest", cascade = CascadeType.ALL) 
    @OrderColumn(name = "accidents_id") 
    private Accidents[] accidents; 

    // Getters and setters 
} 

@Entity 
@Table(name = "Accidents") 
public class Accidents 
{ 
    public Accidents() 
    { 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "accidents_id") 
    private long AccidentId; 


    @Column(name = "amount", nullable = false) 
    private Float amount; 

    @ManyToOne(optional = false, cascade = CascadeType.ALL) 
    @JoinColumn(name = "quote_request_id", nullable = false) 
    private QuoteRequest quoteRequest; 

    // Getters and setters 
} 

Почему не он вставляет вновь сгенерированный идентификатор в столбец аварий?

+1

Это выглядит странно. По вашей конфигурации, когда вставлен «Несчастный случай», он должен содержать «quote_request_id» вставить вместе. Могу ли я узнать, какую версию Hibernate вы используете? И что еще более важно: для созданного вами объекта «Аварии» вы действительно настроили его «quoteRequest» правильно? (Мне жаль, что вы не устанавливаете «аварии» на стороне «QuoteRequest», но забыли «quoteRequest» на стороне «Несчастные случаи», так как последняя сторона, которая владеет этим отношением). Одна проблема OT: вы должны называть ее «Авария» вместо «Несчастных случаев», поскольку она представляет собой только один случай. –

+0

Я использую Hibernate. 4.3.9.Final Я не назначаю quoteRequest о авариях явно. Я создаю Аварии, добавляя их в QuoteRequest. При создании аварий я не устанавливаю свойство quoteRequest. Должен ли я что-то делать с этим? Нужно ли иметь двунаправленные отношения? Хороший призыв к наименованию. Я не придумал это, но я застрял с ним сейчас :) –

+0

Тогда в этом проблема. Дам вам ответ –

ответ

0

When creating Accidents, I don't set the quoteRequest property. Should I be doing anything with that? Do I need to have a bi-directional relationship?

Это причина ,

Во-первых, «Нужно ли иметь двунаправленные отношения?». Ну, ты единственный, кто может сказать. Однако у вас уже есть двунаправленные отношения. Кстати, вы установили это, сторона Accident владеет отношениями. Это означает, что для столбца DB Accident.quote_req_id используется поле Accident.quoteRequest. Поскольку вы не заполняете это поле, Hibernate предполагает, что это null. Следовательно, он вставляет null. Все ожидаемое поведение.

Короче говоря, вы должны убедиться, что QuoteRequest.accident и Accident.quoteRequest соответствует, например:

class QuoteRequest { 
    private List<Accident> accidents; // I prefer List or Set 

    public void setAccidents(List<Accident> accidents) { 
     this.accidents = new ArrayList<>(accidents); 
     for (Accident accident:accidents) { 
      accident.setQuoteRequest(this); 
     } 
    } 
} 

class Accident { 
    private QuoteRequest quoteRequest; 
    public setQuoteRequest(QuoteRequest quoteRequest) { 
     // there will be something more... 
     this.quoteRequest = quoteRequest; 
    } 
} 

Это лишь очень простой пример того, что он будет выглядеть. Короче говоря, вам нужно установить Accident.quoteRequest с соответствующим значением. В вышеприведенной реализации все еще есть много проблем, и я оставлю это для вас (например, когда вы ранее установили accidents и теперь заменены другим списком)

2

Во-первых, изменить @OneToMany с помощью массива с помощью List вместо:

@OneToMany(mappedBy = "quoteRequest", cascade = CascadeType.ALL) 
@OrderColumn(name = "accidents_id") 
private List<Accidents> accidents = new ArrayList()<>; 

Убедитесь, что вы установили обе стороны ассоциаций:

QuoteRequest quoteRequest = ... 
Accidents accidents = ... 

quoteRequest.getAccidents().add(accident); 
accident.setQuoteRequest(quoteRequest); 
+0

Влад, я на самом деле просто читал ваш блог сегодня. –

+0

Надеюсь, вам понравится читать это;) –