2016-11-28 11 views
0

enter image description hereОшибка при сохранении объекта, так как нулевой

Я получаю сообщение об ошибке при сохранении ValoracioItem, потому что это idEscalaPregunta является недействительным. В LOG Я вижу, что он пытается добавить две вставки первой в t_valoracioitem, которая является правильной, но вторая в a_escalaresposta, что она уже там, и она ничего не должна делать. И затем транзакция откат.

Я не вижу, где проблема.

Метод сохранения

public Valoracio createValoracio(Escala escala, long idResident, long idUser) { 

    Valoracio valoracio = valoracioMgr.findById(8L); 

    preguntes = escalaPreguntaMgr.findByEscalaId(escala.getId()); 

    ValoracioItem vitem = new ValoracioItem(valoracio, preguntes.get(0)); 
    //pretuntes.get(0).getId() is not null and has id 
    vitem.setResposta(new EscalaResposta()); 

    ValoracioItemMgr.save(vitem); 

    return valoracio; 
} 

класса ValoracioItem

@Entity 
@Table(name = "t_valoracioItem") 
public class ValoracioItem extends BaseEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @ManyToOne(cascade = CascadeType.PERSIST, optional = false) 
    @JoinColumn(name = "idEscalaPregunta", nullable = false) 
    private EscalaPregunta pregunta; 

    @ManyToOne(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = "idEscalaResposta") 
    private EscalaResposta resposta; 

Класс EscalaPregunta

@Entity 
@Table(name = "a_escalaPregunta") 
public class EscalaPregunta extends BaseEntity { 

    static final String PREFIX = "pia.entity.EscalaPregunta."; 
    public static final String findAll = PREFIX + "findAll"; 
    public static final String findById = PREFIX + "findById"; 
    public static final String findByEscalaId = PREFIX + "findByEscalaId"; 
    public static final String findByPregunta = PREFIX + "findByPregunta"; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String pregunta; 

    @OneToMany(mappedBy = "pregunta", cascade = CascadeType.ALL) 
    private Collection<EscalaResposta> respostes; 

    @OneToMany(mappedBy = "pregunta", cascade = CascadeType.PERSIST) 
    private Collection<ValoracioItem> valoracioItems = new HashSet<>(); 

Класс EscalaResposta

@Entity 
@Table(name = "a_escalaResposta") 
public class EscalaResposta extends BaseEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "idEscalaPregunta", referencedColumnName = "id", nullable = false) 
    private EscalaPregunta pregunta; 

    @OneToMany(mappedBy = "resposta", cascade = CascadeType.PERSIST) 
    private Collection<ValoracioItem> valoracioItems = new HashSet<>(); 

Вход

13:54:01,698 INFO Hibernate: 
13:54:01,698 INFO  /* insert es.business.pia.entity.ValoracioItem 
13:54:01,698 INFO   */ insert 
13:54:01,698 INFO   into 
13:54:01,698 INFO    t_valoracioItem 
13:54:01,698 INFO    (idEscalaPregunta, idEscalaResposta, idValoracio) 
13:54:01,698 INFO   values 
13:54:01,698 INFO    (?, ?, ?) 
13:54:01,705 INFO Hibernate: 
13:54:01,705 INFO  /* insert es.business.pia.entity.EscalaResposta 
13:54:01,705 INFO   */ insert 
13:54:01,705 INFO   into 
13:54:01,705 INFO    a_escalaResposta 
13:54:01,705 INFO    (explicacio, idEscalaPregunta, punts, resposta) 
13:54:01,705 INFO   values 
13:54:01,705 INFO    (?, ?, ?, ?) 

ответ

0

Проблема заключается в том, что он модифицируется в классе ValoracioItem на свойства Pregunta и resposta в CascadeType.PERSIST и попытаться сохранить их вместо того, чтобы экономить только внешний ключ, и создается новый EscalaResposta

@ManyToOne 
@JoinColumn(name = "idEscalaPregunta", nullable = false) 
private EscalaPregunta pregunta; 

@ManyToOne 
@JoinColumn(name = "idEscalaResposta") 
private EscalaResposta resposta;