Spring Data JPA: de l'Extraction de données à partir de l'entité juste après la méthode save()

Je suis à l'aide de Spring Data JPA Hibernate JPA fournisseur dans mon projet.
À l'intérieur de mon service j'ai une méthode, qui permet d'économiser une entité dans la base de données et que l'utilisation d'objet retourné j'ai essayer de chercher plus de détails à propos de cette entité.
En conséquence, les détails ne sont pas récupérés. Dans les logs je ne vois que des instruction insert, sans sélectionner pour plus de détails.

Voici mon code:

Configuration:

@Configuration
@Profile("test")
@EnableJpaRepositories(basePackages = {"pl.lodz.uml.sonda.common.repositories"})
@EnableTransactionManagement
@PropertySource(value = "classpath:db.test.properties")
public class PersistenceConfigTest {
@Autowired
private Environment env;
@Value("classpath:sql/test-initialization.sql")
private Resource sqlInitializationScript;
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.username"));
dataSource.setPassword(env.getProperty("jdbc.password"));
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setShowSql(env.getProperty("hibernate.showSQL", Boolean.class));
adapter.setGenerateDdl(env.getProperty("hibernate.hbm2ddl", Boolean.class));
entityManagerFactory.setDataSource(dataSource());
entityManagerFactory.setPackagesToScan("pl.lodz.uml.sonda.common.domains");
entityManagerFactory.setJpaVendorAdapter(adapter);
Properties properties = new Properties();
properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(properties);
return entityManagerFactory;
}
@Bean(name = "transactionManager")
public PlatformTransactionManager platformTransactionManager() {
EntityManagerFactory entityManagerFactory = entityManagerFactory().getObject();
return new JpaTransactionManager(entityManagerFactory);
}
@Bean
public DataSourceInitializer dataSourceInitializer() {
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(sqlInitializationScript);
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource());
initializer.setDatabasePopulator(populator);
initializer.setEnabled(env.getProperty("db.initialization", Boolean.class));
return initializer;
}
@Bean
public ProbeService probeService() {
return new ProbeServiceImpl();
}
}

Service:

@Service
@Transactional
public class ProbeServiceImpl implements ProbeService {
@Autowired
private ProbeRepository probeRepository;
@Override
public Probe saveProbe(Probe probe) {
Probe saved = probeRepository.save(probe);
saved.getGroup().getName();
return saved;
}
}

Test Simple:

@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
@ContextConfiguration(classes = {PersistenceConfigTest.class})
@Transactional
@TransactionConfiguration(defaultRollback = true)
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class
})
public class ProbeServiceImplTest {
@Autowired
private ProbeService probeService;
@Test
public void test() {
Probe probe = ProbeFixtures.generateProbeSample("Test one");
probe.setGroup(ProbeFixtures.generateProbeGroupSample(1));
Probe saved = probeService.saveProbe(probe);
System.out.println("Group name: " + saved.getGroup().getName());
}
}

Entités:

@Entity
@Table(name = "probes")
public class Probe {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "probe_id")
private long probeId;
@Column(name = "probe_title", nullable = false)
private String title;
@Column(name = "probe_description", nullable = true)
private String description;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "probe_group_id", nullable = true)
private ProbeGroup group;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "probe_image_id", nullable = true)
private ProbeFile image;
@Column(name = "probe_published_date", nullable = false)
private Date published;
@Column(name = "probe_last_updated_date", nullable = false)
private Date updated;
@Column(name = "probe_expire_date", nullable = false)
private Date expires;
@Column(name = "probe_is_active", nullable = false)
private boolean isActive;
@OneToMany(mappedBy = "probe", fetch = FetchType.LAZY)
private List<Question> questions;
@OneToMany(mappedBy = "probe", fetch = FetchType.LAZY)
private List<Vote> votes;
public Probe() {
questions = new LinkedList<>();
votes = new LinkedList<>();
}
//getters & setters ...
@Entity
@Table(name = "probe_groups")
public class ProbeGroup {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "probe_group_id")
private long probeGroupId;
@Column(name = "probe_group_name", nullable = false, unique = true)
private String name;
@Column(name = "probe_group_description", nullable = true)
private String description;
@OneToMany(mappedBy = "group", fetch = FetchType.LAZY)
private List<Probe> probes;
public ProbeGroup() {
probes = new LinkedList<>();
}
//getters & setters ...

Et les derniers journaux de lignes:

Hibernate: insert into probes (probe_description, probe_expire_date, probe_group_id, probe_image_id, probe_is_active, probe_published_date, probe_title, probe_last_updated_date) values (?, ?, ?, ?, ?, ?, ?, ?)
Group name: null

J'ai aussi essayé d'exécuter spring data jpa méthode - getOne(id) après save(), mais aussi il ne fonctionne pas (instruction insert invoquée, sélectionnez non);

Mise à JOUR:
J'ai enlevé @Transactional annotaion de mon service et de test. Maintenant quand je suis à l'enregistrement d'une entité, puis aller chercher de la même entité, j'ai deux instructions sql dans les journaux: insérer, puis sélectionnez.
Peut-être que mon problème est en raison de mauvais persistance ou de la configuration de la transaction. Ce que Vous en pensez?

Je vais avoir un problème similaire: mon journal de transactions est mis à jour via le déclencheur et les entrées de journal sont modélisés Entités, mais la relation n'est pas chargé après saveAndFlush(), donc je dois passer l'ID et chercher comme si je n'avais pas déjà l'objet. Yay Printemps.
La première: Ne pas utiliser Transactionnelle annotations au Printemps (de données) des tests. Le printemps crée pour vous une transaction et des restaurations de la transaction. Deuxième: Un physique de chasse est après une validation. Les méthodes annotées avec Transactionnelle sera engagée après avoir quitté une méthode (si cette méthode n'ont pas soulevé une exception).
S'il vous plaît, écrire ci-dessous comment vous avez résolu ce problème.

OriginalL'auteur bhop | 2014-08-23