powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / как defaultRollback влияет на object references an unsaved transient instance - save the t
4 сообщений из 4, страница 1 из 1
как defaultRollback влияет на object references an unsaved transient instance - save the t
    #38406402
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть такой тест:
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
@TransactionConfiguration(defaultRollback = false)//
@ContextConfiguration(locations = {"classpath:/test/BeanConfig.xml"})
public class CandidateServiceTest extends AbstractTransactionalJUnit4SpringContextTests{
	
	@Autowired
	private SessionFactory sessionFactory;
	
	@Autowired
	private CandidateService candidateService;
	@Autowired
	private VacancyService vacancyService;
	
	private Candidate candidate;
	
	private Vacancy vacancy;
	
	private Skill skill;
	
	private Event event;
	
	@BeforeClass
	public static void initialize() throws Exception{
		
		UtilMethods.createTestDb();
		
		
	}
	@Before
	public void setup() {
	    TestingAuthenticationToken testToken = new TestingAuthenticationToken("testUser", "");
	    SecurityContextHolder.getContext().setAuthentication(testToken);
	    addAndSaveCandidate();
	}

	@After
	public void cleanUp() {
	    SecurityContextHolder.clearContext();
	}
	@Test
	public void add(){
		List<Candidate> candidates = candidateService.findByName(candidate.getName());
		Assert.assertNotNull(candidates);
		Assert.assertEquals("88888", candidates.get(0).getPhone());
	}
	
	@Test
	public void update(){
		Integer id = candidate.getId();
		Candidate candidateFromDB =	candidateService.findById(id);
		candidateFromDB.setName("newName");
		candidateFromDB.setPhone("4444");
		candidateService.update(candidate);
		Candidate candidateAfterChange = candidateService.findById(id);
		Assert.assertEquals("4444", candidateAfterChange.getPhone());
		Assert.assertEquals("newName", candidate.getName());
	}
	@Test
	public void delete(){
		candidateService.delete(candidate);
		Integer id = candidate.getId();
		Candidate candidateAfterDelete  = candidateService.findById(id);
		Assert.assertNull(candidateAfterDelete);
	}
	@Test
	public void updateCandidateAndLinkedEntities(){
		
		addvacancy();
		Set<Vacancy> vacancies = new HashSet<Vacancy>();
		vacancies.add(vacancy);
		
		addSkill();
		Set<Skill> skills = new HashSet<Skill>();
		skills.add(skill);
		
		addEvent();
		Set<Event> events = new HashSet<Event>();
		events.add(event);
		
		candidateService.updateCandidateAndLinkedEntities(candidate,vacancies,skills, events);
		Candidate candidateFromDB = candidateService.findById(candidate.getId());
		
		Assert.assertEquals(1, candidateFromDB.getVacancies().size());
		Assert.assertEquals(1, candidateFromDB.getSkills().size());
		Assert.assertEquals(1, candidateFromDB.getEvents().size());
	}
	
	//public void 
	public void  addAndSaveCandidate(){
		candidate = new Candidate();
		candidate.setName("testUser");
		candidate.setPhone("88888");
		candidateService.add(candidate);
	}
	
	public void  addvacancy(){
		vacancy = new Vacancy();
		vacancy.setName("testVacancy");
		vacancy.setDescription("trololorkt");
		vacancy.setDate(new Date());
	//	vacancyService.add(vacancy);
	}
	public void addSkill(){
		skill = new Skill();
		skill.setName("testSkill");
	}
	
	public void addEvent(){
		event = new Event();
		event.setName("testEvent");
		event.setDescription("testEventDescription");
		event.setDate(new Date());
		event.setEventDate(new Date());
		
		EventType eventType = new EventType();
		eventType.setName("type");
		event.setEventType(eventType);
		
		EventStatus eventStatus = new EventStatus();
		eventStatus.setName("status");
		event.setEventStatus(eventStatus);	
	}
	
	public Candidate getCandidate() {
		return candidate;
	}
	public void setCandidate(Candidate candidate) {
		this.candidate = candidate;
	}
	
}

запускаю - получаю


Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.epam.hhsystem.model.status.Skill; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.epam.hhsystem.model.status.Skill
	at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:166)
	at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:680)
	at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:562)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:591)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:297)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:192)
	at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:395)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:91)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.epam.hhsystem.model.status.Skill
	at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:249)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:486)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:151)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:863)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1253)
	at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:364)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:356)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:281)
	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:328)
	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
	at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
	at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
	at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
	at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:554)
	... 26 more



Код: java
1.
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.epam.hhsystem.model.status.Skill

эта строчка говорит мне. что Skill нет в бд.

Но как может быть, что эта проблема решается, если написать над тестом так:
@TransactionConfiguration(defaultRollback = true)

?
...
Рейтинг: 0 / 0
как defaultRollback влияет на object references an unsaved transient instance - save the t
    #38406410
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из stacktrace видно, что коммит запущеный спрингом приводит к flush хибернейт сессии.
defaultRollback не вызывает коммит и не приводит к флашу.
Для того чтобы тест был валидным, вероятно, стоит вызывать flush сессии вручную.
...
Рейтинг: 0 / 0
как defaultRollback влияет на object references an unsaved transient instance - save the t
    #38406413
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё эта ошибка показывает то что сервису, возможно, стоило вызвать flush самостоятельно. В противном случае это приведёт к том что ошибка одного метода сервиса приведёт к исключению в другом методе, возможно даже другого сервиса (которому придется вызвать flush). И такую ошибку сложнее анализировать. Потому что stacktrace не указывает на конретный метод, который привел к ошибке.
...
Рейтинг: 0 / 0
как defaultRollback влияет на object references an unsaved transient instance - save the t
    #38406481
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

а, понятно - спасибо.

лучше наверное я флаш руками вызывать не буду, а поменяю defaultRollback на false. Ведь по идее этот метод абстрагирован от прямой работы с БД
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / как defaultRollback влияет на object references an unsaved transient instance - save the t
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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