Спящий |Отношение ManyToOne извлекает объект один раз - PullRequest
0 голосов
/ 03 марта 2019

У меня есть 2 сущности, Пользователь и Почта.Использование spring-boot

У пользователей много постов, а в постах один пользователь.Я аннотировал их, как показано ниже.Когда я делаю запрос на все сообщения в БД, он возвращает список для сообщений, как показано ниже.

POST 1 и POST 2 имеют одно и то же свойство User, и только один из них может получить связанного пользователя.Когда другой пост впервые получает другого пользователя, он может получить этого пользователя.

Мне нужен полный объект пользователя для каждой записи поста.

(я использую Lombok [@Data])

Результат (json)

[{
    "id": 1,
    "context": "POST 1",
    "user": {
        "id": 1,
        "username": "user_1",
        "picture": "pic_1",
        "is_active": true,
        "is_verified": true
    }
},
{
    "id": 2,
    "context": "POST 2",
    "user": 1,
},
{
    "id": 3,
    "context": "POST 3",
    "user": {
        "id": 2,
        "username": "user_2",
        "picture": "pic_2",
        "is_active": true,
        "is_verified": true
    }
}]

Post.java

@Data
@Entity(name = "Post")
@Table(name = "post")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Post extends PersistentObject implements Serializable {

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

    private String context;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    @JsonIgnoreProperties(ignoreUnknown = true, value = {"password", "isActive", "isVerified", "blockedUsers"})
    private User user;
}

User.java

@Data
    @Entity(name = "User")
    @Table(name = "user")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler", "posts", "following_locations", "blocked_users"})
@DynamicUpdate
public class User extends PersistentObject implements Serializable
{

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

    @JsonProperty("username")
    private String username;

    @JsonProperty("password")
    private String password;

    @JsonProperty("picture")
    private String picture;

    @JsonProperty("is_active")
    private Boolean isActive;

    @JsonProperty("is_verified")
    private Boolean isVerified;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JsonBackReference(value = "user_posts")
    @JsonProperty("posts")
    private List<Post> posts;

    @OneToMany(mappedBy = "id", fetch = FetchType.LAZY)
    @JsonBackReference(value = "user_following_locations")
    @JsonProperty("following_locations")
    public List<Location> followingLocations;

    @OneToMany(mappedBy = "blocker", fetch = FetchType.LAZY)
    @JsonProperty("blocked_users")
    private List<BlockedUser> blockedUsers;
}

1 Ответ

0 голосов
/ 11 марта 2019

Как упоминал Михал Зибер, это было из-за аннотации @JsonIdentityInfo.Это делает объекты сериализуемыми единовременно.

...