Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Data JPA Repository - get id after save new object into List / 9 сообщений из 9, страница 1 из 1
04.05.2014, 12:02
    #38632274
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
Здравствуйте, подскажите пожалуйста, а коим образом мне получить id объекта сохраняемого в уже существующий список.
Структура такова.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
	@Inject
	private ObjectiveRepository objectiveRepository;

	@Inject
	private ActionRepository actionRepository;

.......


	public Action createAction(long participantId, TkModule module, long objectiveId, ActionModel actionModel) {

		Objective objective = objectiveRepository.findByParticipantIdAndModuleAndId(participantId, module, objectiveId);

		if (objective != null) {
			Action action = new Action();
			action.setName(actionModel.getName());
			action.setAmount(actionModel.getAmount());
			action.setDateStart(actionModel.getDateStart());
			if (actionModel.getDateEnd() != null) {
				action.setDateEnd(actionModel.getDateEnd());
			}
			action.setFrequencyFlag(actionModel.getFrequencyFlag());
			action.setDaysOfWeek(actionModel.getDaysOfWeek());
			action.setObjective(objective);

			objective.getActions().add(action);
			
			objectiveRepository.save(objective);
//здесь пока по умолчанию, но по сохранению objective action-объект сохраняется в БД, но id=0 так и остается в списке.
			//return action;
		} else {
			throw new ServiceException("The action with this ID does not exist.", "objective.id.bad");
		}
	}



Как это делается правильно? Как сохранять элемент списка существующего объекта и получать назад ID?

Все примеры что нахожу с EntityManager. А оттуда можно вызвать flush() и обновить объект, а как в данном случае? В документации не нашел. (((
Спасибо!
...
Рейтинг: 0 / 0
04.05.2014, 12:39
    #38632298
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
_webdev_,

Упс, забыл Entities


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
@Entity
@Data
public class Objective implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "objective_id")
	private Long id;

.............................

	/**
	 * the actions of objective
	 */
    @OneToMany(mappedBy = "objective", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @Column(nullable = true)
    @JsonManagedReference
	private List<Action> actions;

}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@Entity
@Data
public class Action {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long id;

......................

	/**
	 * objective of this action
	 */
	@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
	@JoinColumn(name = "objective_id")
	@JsonBackReference
	private Objective objective;

}
...
Рейтинг: 0 / 0
04.05.2014, 14:03
    #38632343
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
в список вставляй уже сохраненные (созданные) actions
Код: java
1.
2.
3.
..		
	objective.getActions().add(actionRepository.save(action));
..		
...
Рейтинг: 0 / 0
04.05.2014, 14:24
    #38632353
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
bochkov
Код: java
1.
objective.getActions().add(actionRepository.save(action));



Пришлось изменить в репозитории функцию сохранения, иначе список не видит возвращаемого типа.
с
Код: java
1.
2.
	@Transactional(readOnly = false)
	save(Action action);


на
Код: java
1.
2.
	@Transactional(readOnly = false)
	Action save(Action action);


в итоге получил то же самое

Код: java
1.
2.
org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist:  com.service.objective.domain.objective.Objective; nested exception is org.hibernate.PersistentO
bjectException:
...
Рейтинг: 0 / 0
04.05.2014, 14:44
    #38632370
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
я eclipselink jpa использую и spring-data-jpa таких проблем не было
actionRepository.save я так понял самописный,
у jpa entityManager есть 2 метода сохранения,
persist - генерируемый ид вставляется в сохраняемый объект и объект делается atached,
merge - сохраняемый объект так и остается оригинальным помоему еще и detached
но возвращает atached копию сохраненного объекта
поэтому штатные spring-data repository оперируют entity, которые наследуют интерфейс Persistable,
там предусмотрены методы для определения метода сохранения (создание или изменения существующего)
так что простым save здесь не отделаешься,
если только хибер не имеет свои средства, то тогда его настраивать надо для этой операции,
...
Рейтинг: 0 / 0
04.05.2014, 14:51
    #38632376
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
bochkovя eclipselink jpa использую и spring-data-jpa таких проблем не было
actionRepository.save я так понял самописный,
у jpa entityManager есть 2 метода сохранения,
persist - генерируемый ид вставляется в сохраняемый объект и объект делается atached,
merge - сохраняемый объект так и остается оригинальным помоему еще и detached
но возвращает atached копию сохраненного объекта
поэтому штатные spring-data repository оперируют entity, которые наследуют интерфейс Persistable,
там предусмотрены методы для определения метода сохранения (создание или изменения существующего)
так что простым save здесь не отделаешься,
если только хибер не имеет свои средства, то тогда его настраивать надо для этой операции,

Я это все приблизительно понимаю, но нигде не могу найти как это сделать в этом случае. Вот как у меня выглядит репозиторий.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
@RepositoryDefinition(domainClass = Objective.class, idClass = Long.class)
@Transactional(readOnly = true)
public interface ObjectiveRepository {

	/**
	 * Saves the given objective.
	 * 
	 * @param objective the objective
	 */
	@Transactional(readOnly = false)
	void save(Objective objective);

	/**
	 * Delete the given objective.
	 * 
	 * @param objective the objective
	 */
	@Transactional(readOnly = false)
	void delete(Objective objective);

	/**
	 * finds any objective by id
	 * 
	 * @param id 
	 * @return the objective
	 */
	Objective findById(long id);

}



Вот документация
http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html
...
Рейтинг: 0 / 0
04.05.2014, 15:09
    #38632387
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
репозиторий всего 2 строки
Код: java
1.
2.
public interface ObjectiveRepository extends JpaRepository<Objective, Long>/**, JpaSpecificationExecutor<Objective>(полезные методы емеет)**/{
}



entity
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Entity
@Data
public class Objective implements Persistable<Long>,Serializable {
...
public boolean isNew(){
return id==null;
}
..
}


и конфиг настроить надо чтоб наши репозитории спринг сам реализовал, он это умеет
Код: xml
1.
 <jpa:repositories base-package="org....packagewheremyrepositoryonly" />
...
Рейтинг: 0 / 0
04.05.2014, 17:48
    #38632478
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
bochkov,

Спасибо, работает, но теперь я не могу удалить элемент из списка. Пробую и напрямую и из родительского. Никак. (((
Что я опять забыл?

Код: java
1.
2.
3.
4.
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL,orphanRemoval=true)
    @Column(nullable = true)
    @JsonManagedReference
	private List<Action> actions;



Код: java
1.
2.
3.
4.
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "objective_id")
	@JsonBackReference
	private Objective objective;



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	public void deleteAction(long participantId, TkModule module, long objectiveId, long actionId) {

		Action action = actionRepository.findAction(participantId, module, objectiveId, actionId);

		if (action != null) {
			Objective o = action.getObjective();
			o.getActions().remove(action);
			objectiveRepository.save(o);
//			actionRepository.delete(action);
		} else {
			throw new ServiceException("The action with this ID does not exist.", "action.id.bad");
		}
	}
...
Рейтинг: 0 / 0
05.05.2014, 00:11
    #38632657
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA Repository - get id after save new object into List
чето с аннотациями каша какая то, я бы так сделал
Код: java
1.
2.
3.
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL,orphanRemoval=true, mappedBy="objective")
    @JsonManagedReference
    private List<Action> actions;



Код: java
1.
2.
3.
4.
        @ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "objective_id",nullable = false)
	@JsonBackReference
	private Objective objective;
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Data JPA Repository - get id after save new object into List / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]