Я пытаюсь сохранить эту модель в спящем режиме persist
метод:
package com.neo.jpa;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
@Entity
@Table(name="scoring_response"
)
public class Response {
@Id
@SequenceGenerator(name="scoring_credit_response_sequence" , sequenceName="scoring_credit_response_sequence")
@GeneratedValue(generator="scoring_credit_response_sequence")
private Long id;
@JoinColumn(name="dossier_reference")
@ManyToOne(fetch=FetchType.LAZY , optional=false)
@NotNull
private Dossier reference;
@ManyToOne(fetch=FetchType.LAZY , optional=false , cascade= {CascadeType.DETACH})
@JoinColumn(name="question_code")
@NotNull
private Question question;
@Column(name="response" , columnDefinition="text")
private String response;
public Response() {}
public Response(String jsonString) {
System.out.println(jsonString);
}
//getters and setters
}
Где Dossier
и Question
- простая модель ключевого значения.
Когда я пытаюсь сохранить новый объект Response
с сохраненным идентификатором вопроса (идентификатор присутствует в базе данных), все работает нормально.
Но когда я пытаюсь сохранить новый Response
с несохраненным идентификатором вопроса, поведение в порядке, я получил эту трассировку ошибки:
"Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class org.apache.deltaspike.data.api.QueryInvocationException,message=Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class org.apache.deltaspike.data.api.QueryInvocationException,message=Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class java.lang.reflect.InvocationTargetException,message=null",
"Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class org.apache.deltaspike.data.api.QueryInvocationException,message=Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class java.lang.reflect.InvocationTargetException,message=null",
"Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class java.lang.reflect.InvocationTargetException,message=null",
null,
"org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation: com.neo.jpa.Response.question -> com.neo.jpa.Question",
"Not-null property references a transient value - transient instance must be saved before current operation: com.neo.jpa.Response.question -> com.neo.jpa.Question"
Но все последующие запросы не будут выполнены, если идентификатор вопроса сохранен или нет. Я не знаю почему:
"Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class org.apache.deltaspike.data.api.QueryInvocationException,message=Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class org.apache.deltaspike.data.api.QueryInvocationException,message=Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class java.lang.reflect.InvocationTargetException,message=null",
"Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class org.apache.deltaspike.data.api.QueryInvocationException,message=Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class java.lang.reflect.InvocationTargetException,message=null",
"Failed calling Repository: [Repository=com.neo.repository.ResponseRepository,entity=com.neo.jpa.Response,method=persist,exception=class java.lang.reflect.InvocationTargetException,message=null",
null,
"There are delayed insert actions before operation as cascade level 0."
]
}
Пожалуйста, я хочу понять, в чем проблема.
Примечание: когда я использую hibernate save
метод, все работает хорошо.