我有一个实体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
,只需要School
id
就足够了,不需要其他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方法的工作原理