【发布时间】:2015-06-04 12:25:40
【问题描述】:
我有以下实体:
@Entity
public class Customer extends BaseEntity {
private String firstname;
private String lastname;
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private Set<Address> addresses;
...
@Entity
public class Address extends BaseEntity {
private String street;
private String houseNumber;
private String zipCode;
private String city;
@ManyToOne
private Customer customer;
...
还有如下存储库接口类:
@Repository
public interface CustomerRepository extends CrudRepository<Customer, Long> {
@Query("select c from Customer c join c.addresses a where (a.city = :cityName)")
List<Customer> findByCity(@Param("cityName")String city);
}
现在,我正在尝试运行以下集成测试,但它失败了,我完全不知道为什么。不幸的是,我是 Spring 的初学者,我正在努力学习它;-)
@Test
public void testFindCustomerByCity() {
Customer customer = new Customer("Max", "Tester");
Address address = new Address("Street", "1", "12345", "City");
HashSet<Address> addresses = new HashSet<Address>();
addresses.add(address);
customer.setAddresses(addresses);
Customer savedCustomer = customerRepository.save(customer);
Assert.assertTrue(savedCustomer.getId() > 0);
List<Customer> customerList = customerRepository.findByCity("City");
Assert.assertThat(customerList.size(), is(1));
}
错误信息是:
java.lang.AssertionError: 预期:是 但是:是
为什么结果为空。我的测试设置错了吗?实体关系? 很好,如果你能帮助我。
【问题讨论】:
-
你没有在地址上设置客户,只在客户中设置地址。
-
@M 好的我已经添加了
address.setCustomer(customer);并且它有效......但我真的不明白......我想,给父实体提供子实体就足够了。也许您可以简短地解释一下,或者给我一个链接网址作为提示...无论如何,谢谢您的快速回答。 -
您有一个带有
null客户的地址,正如您指定的那样,该关系由地址中的客户属性管理。如果没有设置,数据库应该如何知道存在关系。另外,setAddresses是向客户添加地址的一种非常糟糕的方式。删除该方法并创建一个您可能管理关系的addAddress方法。 -
要明确一点,当您没有在
address中设置customer时,是否在没有客户外键的情况下保存到数据库中的地址?还是查找查询有问题?对于以后访问此问题的任何人来说,很高兴知道这一点。 -
@DuncanKinnear 没有客户外键