簡體   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