JPA Bidirectional OneToOne不工作

时间:2017-07-26 15:57:11

标签: java jpa entity bidirectional

我尝试建立双向关系。我使用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
    ]
})

在两个测试中,最后一个语句都失败了。有任何想法吗?谢谢你的建议。

1 个答案:

答案 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属性的那一侧)。因此,协会甚至不会保存在数据库中,就像在您之前的代码段中一样。

相关问题