Hibernate жалуется на нулевой @Id в @OneToOne, даже если он не нулевой - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь достичь ассоциации @OneToOne, используя те же @Id между Car и Person. Person имеет необязательный Car, но Car имеет обязательный Person (поэтому мне нужен внешний ключ внутри таблицы "cars", указывающий на существующий Person):

@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
}

Stacktrace:

org.springframework.orm.jpa.JpaSystemException: попытка назначить идентификатор из нулевое свойство «один к одному» [com.project.entity.Car.person]; вложенным исключением является org.hibernate.id.IdentifierGenerationException: попытка присвоить идентификатор из нулевого свойства «один к одному» [com.project.entity.Car.person]

Я следовал этому решению о том, как иметь общий идентификатор. Схема в базе данных выглядит хорошо, и работает именно так, как я хочу. Если я удаляю автомобиль, ничего не происходит. Если я удалю человека, которому принадлежит 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

1 Ответ

1 голос
/ 03 марта 2020

(Отказ от ответственности: это не должно было быть Q & A)

Проблема в аннотации @MapsId. Изменение на:

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

, кажется, решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...