当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA:在save()方法之后从实体获取数据

汤英豪
2023-03-14

我在我的项目中使用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<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

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

共有1个答案

曾典
2023-03-14

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

 类似资料:
  • 问题内容: 我有些困惑,很想得到一个答案,可以帮助我理清思路。假设我有一个后端(nodejs,express等),我在其中存储用户及其数据,有时我想从后端获取数据,例如用户登录后的用户信息或产品列表并保存他们在状态。 到目前为止,我所看到的方法是,在组件加载之前获取数据,并使用响应中的数据调度操作。但是我最近开始对此进行深入研究,并且看到了我较早知道的React- Thunk库,并开始怀疑从后端/

  • 问题内容: 在Spring MVC中使用PropertyEditor时,让它们从数据库中获取实体是否不好?我应该改为创建一个空实体并设置其ID。 例如,实体Employee: 使用以下GenericEntityEditor在下面的PropertyEditor中获取Entity是一个坏主意: 可以绑定在控制器中: 是否更喜欢对EmployeeEditor使用更具体的方法,并使其仅实例化Employe

  • 问题内容: 我正在使用Spring MVC。当method = post时,我无法从url获取参数。但是,当我将方法更改为GET时,便可以获取所有参数。 这是我的表格: 这是我的控制器: 我该如何解决? 问题答案: 如果删除,Spring批注将正常工作。 你甚至可以从request对象获取参数。 如果属性数量很大,请使用表单。会方便的。入门指南。 如果要接收,请配置多部分解析器。

  • 当试图更新现有的Django模型对象时(使用< code>save()方法),会插入一个新行。 例如: 在第二次调用< code>save()方法之后,一个重复的条目被插入到我的表中。 以下是模型定义的示例:

  • 我在我的GAE数据存储实验中发现了一些很奇怪的东西。我使用的是GAE SDK 1.7.5。我不确定我的发现是否正确。 基本上,我发现在执行数据存储get之前,将实体放入数据存储并进行计数不会返回正确的值。 如果你想更深入地挖掘,这里是我前面的SO问题中的实际代码:

  • candref.java grpMember.java member.java 提前道谢。