java jpa save,java – Spring Data JPA:在save()方法之后从实体中获取数据

我在我的项目中使用Spring Data JPA和Hibernate JPA提供程序.

在我的服务中,我有一个方法,它将实体保存在数据库中,而不是使用返回的对象,我尝试获取有关此实体的更多详细信息.

因此,不会获取详细信息.在日志中,我只看到insert语句,没有select的详细信息.

这是我的代码:

组态:

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

@OneToMany(mappedBy = "probe", fetch = FetchType.LAZY)

private List 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 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数据jpa方法 – getOne(id),但它也不起作用(insert语句调用,select not);

更新:

我从我的服务和测试中删除了@Transactional annotaion.现在当我保存一个实体然后获取同一个实体时,我在日志中有两个sql语句:insert然后选择.

也许我的问题是由于错误的持久性/事务配置.你认为呢?

解决方法:

save()方法可能会也可能不会立即将更改写入数据库.如果要立即提交更改,则需要使用T saveAndFlush(T实体)方法.

标签:java,spring,jpa,hibernate,spring-data-jpa

来源: https://codeday.me/bug/20190708/1403824.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值