[英]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.