JPA: Как убрать ненужный SELECT перед сохранением ()? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть сущность Student, которая @ManyToOne с другой сущностью School, где School уже существует в базе данных и исправлена.

сущность User:

@Data
@Entity(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false)
    private String username;

    @ManyToOne
    private School school;
}

Сущность School:

@Data
@Entity(name = "school")
public class School {
    @Id
    @Column(unique = true, nullable = false)
    private int id;

    @Column(nullable = false)
    private String name;

    private String shorten;

    @JsonProperty(value = "logo_url")
    private String logoUrl;

    private float longitude;

    private float latitude;

    @Column(nullable = false)
    private boolean opened;
}

При добавлении пользователя я ОТПРАВЛЯЮ следующую запись json от Почтальона:

{
    "username": "abcd",
    "school_id": 2
}

Затем

School school = new School();
school.setId(2);    //"school_id" above

User user = new User();
user.setUsername("abcd");
user.setSchool(school);

userRepository.save(user);

Поскольку я думаю, что для добавления нового user достаточно только School id, и никаких других параметров School не требуется. Но каждый раз, когда я запускаю, он запускает оператор select, чтобы выбрать все поля от School на id до save().

Мой вопрос: как убрать эту ненужную операцию, чтобы перед save() не было необходимости select? (Я знаю, что пользовательские операторы sql могут быть реализованы, но я чувствую, что это нарушит объектную ориентацию JPA)

Ответы [ 2 ]

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

Вам нужно использовать метод getReference, чтобы избежать этой проблемы

School school = entityManager.getReference(School.class, 2);

Если вы используете Spring Data JPA, этот метод отображается в хранилище как getOne.

См. Как работают методы EntityManager find и getReference при использовании JPA и Hibernate

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

используйте ниже аннотацию для класса сущности

@SelectBeforeUpdate(value=false)
...