gpt4 book ai didi

java - Hibernate 提示@OneToOne 中的空@Id,即使它不是空的

转载 作者:行者123 更新时间:2023-12-02 02:58:37 25 4
gpt4 key购买 nike

我正在尝试实现 @OneToOne 关联,在 CarPerson 之间使用相同的 @Id >。 Person 有一个可选的 Car,但是 Car 有一个必需的 Person(因此我需要一个外键在指向现有 Person 的“cars”表中:

@Entity
@Table(name = "persons")
public class Person {

@Id
@Column(name = "name")
private String name;

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "person")
private Car car;

/**
* For hibernate
*/
@SuppressWarnings("unused")
private Person() {
}

public Person(String name) {
super();
this.name = name;
}

public Car getCar() {
return car;
}

public void setCar(Car car) {
this.car = car;
}

public String getName() {
return name;
}

}

@Entity
@Table(name = "cars")
public class Car {
@Id
@Column(name = "name")
private String name;

@MapsId
@OneToOne
@JoinColumn(name = "name")
@OnDelete(action = OnDeleteAction.CASCADE)
private Person person;

public Car() {
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Person getPerson() {
return person;
}

public void setPerson(Person person) {
this.person = person;
}

}
public interface PersonRepository extends CrudRepository<Person, String> {

}

我的测试用例:

@Autowired
private PersonRepository personRepository;

@Test
public void test() {
Person mike = new Person("Mike");
personRepository.save(mike); //Saved sucessfully

Person alice = new Person("Alice");
Car car = new Car();
car.setPerson(alice);
car.setName(alice.getName());
alice.setCar(car);
personRepository.save(alice); //error
}

堆栈跟踪:

org.springframework.orm.jpa.JpaSystemException: attempted to assign id from null one-to-one property [com.project.entity.Car.person]; nested exception is org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [com.project.entity.Car.person]

我关注了this solution关于如何拥有共享 ID。数据库中的模式看起来很好,并且完全按照我的意愿工作。如果我删除一辆汽车,什么也不会发生。如果我删除一个拥有 Car 的人,他的 Car 也会从数据库中删除。

问题很简单。 我做错了什么?

万一它起到任何作用(我对此表示怀疑),这是我的数据源属性:

spring.jpa.hibernate.dll-auto = create-drop
spring.datasource.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

最佳答案

(免责声明:这不是问答)

问题出在 @MapsId 注释中。将其更改为:

@MapsId("name") //Here
@OneToOne
@JoinColumn(name = "name")
@OnDelete(action = OnDeleteAction.CASCADE)
private Person person;

似乎解决了这个问题。

关于java - Hibernate 提示@OneToOne 中的空@Id,即使它不是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60508864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com