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