繁体   English   中英

JPA双向OneToOne无法正常工作

[英]JPA Bidirectional OneToOne Not working

我尝试建立双向关系。 我正在将Spring Boot 1.5.4.RELEASE与Spring Boot JPA一起使用来生成我的存储库。 我尝试保存两个相互关联的实体,但是它不起作用。 我评论了失败的测试语句。

我的实体:

司机:

@Entity
@ToString
@EqualsAndHashCode
public class Driver {

    public static final String COLUMN_CAR = "car";



    @Id
    @GeneratedValue
    private long id;

    @Getter
    @Setter
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = COLUMN_CAR)
    private Car car;

}

汽车:

@Entity
@ToString
@EqualsAndHashCode
public class Car {

    @Id
    @GeneratedValue
    private long id;

    @Getter
    @Setter
    @OneToOne(mappedBy = Driver.COLUMN_CAR)
    private Driver driver;

}

我使用Spring JPA生成存储库。

DriverRepository:

@Repository
public interface DriverRepository extends CrudRepository<Driver, Long> { }

CarRepository:

@Repository
public interface CarRepository extends CrudRepository<Car, Long> { }

测试:

@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()));
    }

}

在这两个测试中,最后一条语句均失败。 有任何想法吗? 感谢您的建议。

您发布的内容有几个错误。

第一:

@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属性的那一侧)。 因此,该关联甚至都不会保存在数据库中,就像以前的片段中那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM