java - 关于Spring的CrudRepository的一对多的save问题

 脸皮乃身外之物 发布于 2022-10-26 16:47

各位高手,我在使用hibernate、jpa、springdata集成时遇到了如下的问题:

model

@Entity
@Table(name = "t_group", schema = "domain")
public class Group
{
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    @OneToMany(mappedBy = "group", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private Set users;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public Set getUsers()
    {
        return users;
    }

    public void setUsers(Set users)
    {
        this.users = users;
    }

    public Long getId()
    {
        return id;
    }   
}
@Entity
@Table(name = "t_user", schema = "domain")
public class User
{
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "group_id", nullable = false)
    private Group group;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
    
    public Long getId()
    {
        return id;
    }   
}

repository

public interface GroupRepository extends CrudRepository
{

}

config

@Configuration
@EnableJpaRepositories(basePackages = { "**.**.**.repository" })
public class RepositoryIntegrationTestsConfig
{
    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf)
    {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);

        return transactionManager;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource)
    {
        LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
        emfb.setDataSource(dataSource());
        emfb.setJpaVendorAdapter(jpaVendorAdapter());
        emfb.setPackagesToScan("com.**.**.entity");

        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "create");
        properties.setProperty("hibernate.format_sql", "true");
        emfb.setJpaProperties(properties);

        return emfb;
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter()
    {
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        adapter.setDatabase(Database.H2);
        adapter.setShowSql(false);
        adapter.setGenerateDdl(false);
        adapter.setDatabasePlatform("org.hibernate.dialect.H2Dialect");

        return adapter;
    }

    @Bean(name = "integrationTestDataSource")
    public DataSource dataSource()
    {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:~/test;INIT=CREATE SCHEMA IF NOT EXISTS domain");
        dataSource.setUsername("sa");
        dataSource.setPassword("");

        return dataSource;
    }
}

test

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RepositoryIntegrationTestsConfig.class)
public class GroupRepositoryIntegrationTest
{
    @Autowired
    private GroupRepository repository;
    
    @Test
    public void saveShouldSucceed()
    {
        Group group = new Group();
        group.setName("name");
        
        Set users = new HashSet<>();
        User user1 = new User();    
        user1.setName("user1");
        
        User user2 = new User();
        user2.setName("user2");
        
        users.add(user1);
        users.add(user2);

        group.setUsers(users);
        repository.save(group);
    }
}

当我执行测试时,会报如下错误:

...
Caused by: org.h2.jdbc.jdbcSQLException: NULL not allowed for column "GROUP_ID";
...

请问是什么原因?

3 个回答
  • 估计是这句的原因 @JoinColumn(name = "role_id", nullable = false)
    可以通过 UserRepository 尝试去保存一下

    2022-10-27 01:21 回答
  • @JoinColumn(name = "role_id", nullable = false)
    nullable默认值:true。
    默认情况下,JPA 持续性提供程序假设允许所有列包含空值。
    如果不允许该列包含空值,请将 nullable 设置为 false。

    没有实体名称为role,所以找不到role_id。如果避免这个报错的话,nullable修改为true

    2022-10-27 01:21 回答
  • 用了双向关联,user必须调用setGroup方法

    2022-10-27 01:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有