Составной идентификатор в объединенной таблице - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть следующий класс PostLike:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PostLike extends BaseEntity {

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "post_id")
    private Post post;
}

У класса уже есть поле идентификатора, предоставленное родительским классом BaseEntity.

В классе User у меня есть следующее поле:

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
Set<PostLike> userLikes = new HashSet<PostLike>();

И в классе Post:

@OneToMany(mappedBy = "post")
private Set<PostLike> postLikes = new HashSet<PostLike>();

Я хочу, чтобы PostLike имел составной первичный ключ, который состоит из user_id и post_id. Заранее спасибо.

1 Ответ

1 голос
/ 04 апреля 2020

В качестве одного из способов сделать это вы можете использовать @EmbeddedId аннотацию и express этот составной ключ с встраиваемым классом:

@Entity
public class PostLike {

    @Embeddable
    private static class Id implements Serializable {

        @Column(name = "user_id")
        private Long userId;

        @Column(name = "post_id") 
        private Long postId;

        public Id() {
        }

        public Id(Long userId, Long postId) {
            this.userId = userId;
            this.postId = postId;
        }

        // equals and hashCode
    }

    @EmbeddedId
    Id id = new Id();

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "post_id")
    private Post post;


    public PostLike() {
    }

    public PostLike(User user , Post post) {
        this.user = user;
        this.post = post;

        this.id.postId = post.getId();
        this.id.userId = user.getId();

        post.getUserLikes().add(this);
        user.getUserLikes().add(this);
    }
        ... // getters and setters
}

Некоторые примечания:
из javado c из @EmbeddedId

При использовании аннотации EmbeddedId должна быть только одна аннотация EmbeddedId и Id.

из Java Постоянство с Hibernate

Основным преимуществом этой стратегии является возможность двунаправленной навигации. ...
Недостатком является более сложный код, необходимый для управления экземплярами промежуточного объекта для создания и удаления ссылок, которые необходимо сохранять и удалять независимо.

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