JPA:如何在save()之前删除不必要的SELECT



我有一个实体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;
}

添加用户时,我从Postman中发布以下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,只需要Schoolid就足够了,不需要其他School参数。但每次运行时,它都会运行select语句,在save()之前通过id选择School的所有字段。

我的问题是:如何删除这种不必要的操作,以便在save()之前,不需要select?(我知道可以实现自定义sql语句,但我觉得这会打破JPA的面向对象性(

在实体类上使用以下注释

@SelectBeforeUpdate(value=false)

您需要使用getReference方法来避免这个问题

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

如果您使用的是Spring Data JPA,则此方法在存储库中公开为getOne

请参阅使用JPA和Hibernate 时find和getReference EntityManager方法的工作原理

最新更新