【问题标题】:CrudRepository doesn't save dataCrudRepository 不保存数据
【发布时间】:2021-10-05 19:43:34
【问题描述】:

我在通过 CrudRepository 将新对象保存到数据库时遇到问题。有趣的是我可以从存储库中读取数据。

所以,当我获取数据时,我在控制台中有一个 SQL 查询。 当我保存数据时,控制台是空的。此外,CrudRepository.save 返回一个有效的对象,并分配了 id。

你能看一下吗? 提前谢谢你。

控制器类:

@Controller
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Iterable<User>> viewUsers() {
        return ResponseEntity.ok(userRepository.findAll());
    }

    @PutMapping(value = "/users/add", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> addUser(@RequestBody User user) {
        User persisted = userRepository.save(user);
        System.out.println(persisted);
        if (persisted == null) {
            return new ResponseEntity<>("Error while saving user", HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<>("OK", HttpStatus.CREATED);
    }
}

实体类:

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(generator = "system-uuid2")
    @GenericGenerator(name = "system-uuid2", strategy = "uuid2")
    private String id;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "email")
    private String email;
    @Column(name = "password")
    private String password;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("User{");
        sb.append("id='").append(id).append('\'');
        sb.append(", firstName='").append(firstName).append('\'');
        sb.append(", lastName='").append(lastName).append('\'');
        sb.append(", email='").append(email).append('\'');
        sb.append(", password='").append(password).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

创建表的sql:

CREATE TABLE USER(
    ID VARCHAR(255) NOT NULL UNIQUE,
    FIRST_NAME VARCHAR(255) NOT NULL,
    LAST_NAME VARCHAR(255) NOT NULL,
    EMAIL VARCHAR(255) NOT NULL,
    PASSWORD VARCHAR(255) NOT NULL,
    PRIMARY KEY (ID)
);

和基于java的配置:

@Configuration
@EnableJpaRepositories(basePackages = "ua.maximenko.jquizful.repository")
@EnableTransactionManagement
@EnableWebMvc
public class Config implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.indentOutput(true).simpleDateFormat("yyyy-MM-dd HH:mm:ss");
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Bean
    public DataSource dataSource() {
        EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder();
        return dbBuilder
                .setType(EmbeddedDatabaseType.H2)
                .addScript("classpath:sql/create-tables.sql")
                .addScript("classpath:sql/populate-tables.sql")
                .build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        adapter.setShowSql(true);
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setJpaVendorAdapter(adapter);
        factoryBean.setDataSource(dataSource());
        return factoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager tm = new JpaTransactionManager();
        tm.setEntityManagerFactory(entityManagerFactory().getNativeEntityManagerFactory());
        return tm;
    }
}

用户存储库:

package ua.maximenko.jquizful.repository;

import org.springframework.data.repository.CrudRepository;
import ua.maximenko.jquizful.domain.User;

public interface UserRepository extends CrudRepository<User, String> {
}

附上项目结构的屏幕

如果需要任何其他信息,请告诉我。

【问题讨论】:

  • 你也可以添加你的 UserRepository 类
  • 为什么要配置JPA?自动配置不适合你吗?
  • @Lucia 存储库已添加
  • @SimonMartinelli 你的意思是 Config 类中与 JPA 相关的东西是多余的吗?
  • @SimonMartinelli 我已经仔细检查过,Config 类中的 JPA 配置是必要的。如果我错了,你的意思是用户类中的列注释 - 它们也是必需的。

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


【解决方案1】:

我认为这个配置是错误的:

@Bean
public JpaTransactionManager transactionManager() {
    JpaTransactionManager tm = new JpaTransactionManager();
    tm.setEntityManagerFactory(entityManagerFactory().getNativeEntityManagerFactory());
    return tm;
}

您必须在 EntityManagerFactory 上调用 getObject()

@Bean
public JpaTransactionManager transactionManager() {
    JpaTransactionManager tm = new JpaTransactionManager();
    tm.setEntityManagerFactory(entityManagerFactory().getObject());
    return tm;
}

【讨论】:

  • 就是这样!非常感谢!
猜你喜欢
  • 2020-06-09
  • 2020-07-03
  • 1970-01-01
  • 2012-08-24
  • 2020-04-02
  • 1970-01-01
  • 2021-05-24
  • 2020-03-15
  • 2019-12-29
相关资源
最近更新 更多