我尝试建立双向关系。我使用Spring Boot 1.5.4.RELEASE和Spring Boot JPA来生成我的存储库。我尝试保存两个相互关联的实体,但它不起作用。我评论了失败的测试语句。
我的成员:
驱动:
@Entity
@ToString
@EqualsAndHashCode
public class Car {
@Id
@GeneratedValue
private long id;
@Getter
@Setter
@OneToOne(mappedBy = Driver.COLUMN_CAR)
private Driver driver;
}
汽车:
@Repository
public interface DriverRepository extends CrudRepository<Driver, Long> { }
我使用Spring JPA生成存储库。
DriverRepository:
@Repository
public interface CarRepository extends CrudRepository<Car, Long> { }
CarRepository:
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class StackoverflowTest {
@Autowired
private DriverRepository driverRepository;
@Autowired
private CarRepository carRepository;
@Test
public void test1() {
Driver driver = driverRepository.save(new Driver());
Car car = carRepository.save(new Car());
driver.setCar(car);
driverRepository.save(driver);
/* Success, so the driver got the car */
driverRepository.findAll().forEach(eachDriver -> Assert.assertNotNull(eachDriver.getCar()));
/* Fails, so the car doesnt got the driver */
carRepository.findAll().forEach(eachCar -> Assert.assertNotNull(eachCar.getDriver()));
}
@Test
public void test2() {
Driver driver = driverRepository.save(new Driver());
Car car = carRepository.save(new Car());
car.setDriver(driver);
carRepository.save(car);
/* Success, so the car got the driver */
carRepository.findAll().forEach(eachCar -> Assert.assertNotNull(eachCar.getDriver()));
/* Fails, so the driver doesnt got the car */
driverRepository.findAll().forEach(eachDriver -> Assert.assertNotNull(eachDriver.getCar()));
}
}
测试:
import { BrowserModule, Title } from '@angular/platform-browser';
@NgModule({
providers[
Title
]
})
在两个测试中,最后一个语句都失败了。有任何想法吗?谢谢你的建议。
答案 0 :(得分:0)
您发布的内容存在多处错误。
首先:
@OneToOne(mappedBy = Driver.COLUMN_CAR)
mappedBy
期望关联另一侧的 Java字段/属性的名称。不是数据库列的名称。它在这里工作,因为两者碰巧具有相同的名称。
第二
carRepository.findAll().forEach(eachCar -> Assert.assertNotNull(eachCar.getDriver()));
这只是因为您在单个事务中执行所有操作而失败,并且您无法正确初始化关联的两个方面。所以car.driver
就像你初始化它一样:null。
第三
driverRepository.findAll().forEach(eachDriver -> Assert.assertNotNull(eachDriver.getCar()));
你犯了和以前一样的错误,但更糟。在这里,您只初始化了关联的一侧,但是您初始化了关联的逆侧(具有mappedBy
属性的那一侧)。因此,协会甚至不会保存在数据库中,就像在您之前的代码段中一样。