gpt4 book ai didi

java - Spring 数据 JPA : Fetching data from entity just after save() method

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:09 25 4
gpt4 key购买 nike

我在我的项目中使用 Spring Data JPA 和 Hibernate JPA 提供程序。在我的服务中,我有一个方法,它在数据库中保存一个实体,而不是使用返回的对象,我尝试获取有关该实体的更多详细信息。因此,不会获取详细信息。在日志中,我只看到插入语句,没有选择详细信息。

这是我的代码:

配置:

@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
@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;
}
}

简单测试:

@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());
}
}

实体:

@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 ...

最后几行日志:

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

我还尝试在 save() 之后运行 spring data jpa 方法 - getOne(id),但它也不起作用(调用插入语句,不选择);

更新:我从我的服务和测试中删除了@Transactional 注释。现在,当我保存一个实体然后获取同一实体时,我在日志中有两个 sql 语句:插入和选择。也许我的问题是因为错误的持久性/事务配置。你怎么看?

最佳答案

这可能有点过时了,但我遇到了同样的问题,发现 hibernate 二级缓存是问题所在。

关于java - Spring 数据 JPA : Fetching data from entity just after save() method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25462416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com