2015-11-04 2 views
0

У меня проблема, которую я не понимаю. У меня есть несколько объектов:спящий режим: ошибка сохранения с отсоединенным объектом

Сценарий объектных

@Entity 
@Table(name = "scenario") 
public class Scenario { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "scenario_id") 
private int id; 

@Column(name = "title", nullable = false) 
private String title; 

@NotNull 
@DateTimeFormat(pattern = "dd/MM/yyyy") 
@Column(name = "creation_date", nullable = false) 
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate") 
private LocalDate creationDate; 

@OneToMany(mappedBy = "scenario") 
@LazyCollection(LazyCollectionOption.FALSE) 
private Set<Section> sectionList = new HashSet<Section>(); 

@ManyToOne 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinColumn(name = "id", nullable = false) 
private User user; 

@OneToMany(mappedBy = "scenario", orphanRemoval=true) 
@LazyCollection(LazyCollectionOption.FALSE) 
private Set<Plot> plotList = new HashSet<Plot>(); 

Участок Entity

@Entity 
@Table(name = "Plot") 
public class Plot { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "plot_id") 
private int id; 

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

@Column(name = "description") 
private String description; 

@ManyToOne 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinColumn(name = "id", nullable = false) 
private Scenario scenario; 

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "plot_role", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = { 
     @JoinColumn(name = "plot_id") }) 
private Set<Role> roles = new HashSet<Role>(); 

и контроллер

@Autowired 
UserService userService; 

@Autowired 
ScenarioService scenarioService; 

@Autowired 
PlotService plotService; 

@RequestMapping(value = { "/scenario-{id}-newPlot" }, method = RequestMethod.GET) 
public String newPlot(ModelMap model, @PathVariable int id) { 
    Plot plot = new Plot(); 
    Scenario scenario = scenarioService.findById(id); 
    model.addAttribute("scenario", scenario); 
    model.addAttribute("plot", plot); 
    model.addAttribute("edit", false); 
    return "plotform"; 
} 

@RequestMapping(value = { "/scenario-{id}-newPlot" }, method = RequestMethod.POST) 
public String savePlot(@Valid Plot plot, BindingResult result, ModelMap model, @PathVariable int id) { 

    if (result.hasErrors()) { 
     System.out.println(result.toString()); 
     return "plotform"; 
    } 
    model.addAttribute("success", 
      "Plot " + plot.getName() + " created successfully"); 
    plot.setScenario(scenarioService.findById(id)); 
    System.out.println("Plot " + plot.toString()); 
    plotService.savePlot(plot); 

    return "success"; 
} 

У меня тоже есть, DAOS, услуги На и форме. Проблема в том, что когда я пытаюсь сэкономить plot по форме, которую я получаю: Request processing failed; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.btw.spindle.model.Plot

Я не понимаю, как он снят и как его исправить. Я устал, добавляя System.out, чтобы проверить, правильно ли извлекаются необходимые данные из формы. А также у меня есть пользовательский объект (который я не добавил сюда). Соотношение между user и scenario одинаково (от одного до большого) как между scenario и plot. Создание scenario отлично работает, и создание plots вызывает это исключение.

Любые подсказки?

+0

добавить 'cascade = CascadeType.ALL' к вашему' @ ManyToOne' в объекте объекта – Uppicharla

ответ

0

Ошибка возникает, поскольку объект имеет идентификатор. Hibernate различает временные и отдельные объекты и сохраняет работу только с переходными объектами (объекты без идентификатора). Если сохраняются заключает объект отсоединяется (который он будет из-за ID), он возвращает эту ошибку

org.hibernate.PersistentObjectException: отдельностоящий объект передается сохраняются

Я думаю, что вам нужно использовать saveOrUpdate() вместо save()/persist()

Смотрите эту link и this ответ

+0

Этого не должно быть фактор.У меня одинаковая связь между пользователем и сценарием. У обоих объектов есть идентификатор, и при создании сценария с ошибкой ошибки нет. – TergOfSky

0

Существует несколько причин, которые могут вызвать это исключение. Основная идея этого исключения заключается в том, что объект, который вы пытаетесь сохранить, не находится в устойчивом состоянии.

Можете ли вы проверить, имеет ли объект Plot ID ID перед сохранением или его сохранением?

EDIT

Вы решили, совершенен.

+0

Хорошо, я проверил его с помощью sys.out, и он отключился. Вы правы. Объект, переданный persist, имеет id: 1 ... Я просто не знаю, почему. Я не устанавливаю его внутри формы. – TergOfSky

0

Ok MeewU был прав. Проблема состояла в том, что перед тем, как сохранить объект, у объекта был установлен идентификатор. Причиной этого было:

@RequestMapping(value = { "/scenario-{id}-newPlot" }, method = RequestMethod.GET) 
public String newPlot(ModelMap model, @PathVariable int id) { 

Я использовал его, чтобы передать идентификатор сценария, чтобы добавить ot в следующий шаг к сюжету. Но выясняется, что идентификатор сценария был автоматически задан как идентификатор участков. Я изменил имя переменной на «сценарий», и идентификатор больше не настраивается и сохраняется, как и планировалось.