powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Data JPA Repository - get id after save new object into List
9 сообщений из 9, страница 1 из 1
Spring Data JPA Repository - get id after save new object into List
    #38632274
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите пожалуйста, а коим образом мне получить 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
Spring Data JPA Repository - get id after save new object into List
    #38632298
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
Spring Data JPA Repository - get id after save new object into List
    #38632343
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в список вставляй уже сохраненные (созданные) actions
Код: java
1.
2.
3.
..		
	objective.getActions().add(actionRepository.save(action));
..		
...
Рейтинг: 0 / 0
Spring Data JPA Repository - get id after save new object into List
    #38632353
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Spring Data JPA Repository - get id after save new object into List
    #38632370
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я eclipselink jpa использую и spring-data-jpa таких проблем не было
actionRepository.save я так понял самописный,
у jpa entityManager есть 2 метода сохранения,
persist - генерируемый ид вставляется в сохраняемый объект и объект делается atached,
merge - сохраняемый объект так и остается оригинальным помоему еще и detached
но возвращает atached копию сохраненного объекта
поэтому штатные spring-data repository оперируют entity, которые наследуют интерфейс Persistable,
там предусмотрены методы для определения метода сохранения (создание или изменения существующего)
так что простым save здесь не отделаешься,
если только хибер не имеет свои средства, то тогда его настраивать надо для этой операции,
...
Рейтинг: 0 / 0
Spring Data JPA Repository - get id after save new object into List
    #38632376
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Spring Data JPA Repository - get id after save new object into List
    #38632387
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
репозиторий всего 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
Spring Data JPA Repository - get id after save new object into List
    #38632478
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Spring Data JPA Repository - get id after save new object into List
    #38632657
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чето с аннотациями каша какая то, я бы так сделал
Код: 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
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Data JPA Repository - get id after save new object into List
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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