各位高手,我在使用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<User> users;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Set<User> getUsers()
{
return users;
}
public void setUsers(Set<User> 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<Group, Long>
{
}
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<User> 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";
...
请问是什么原因?
用了双向关联,user必须调用setGroup方法