Как управлять отношениями «многие ко многим» в двух таблицах с помощью Hibernate - PullRequest
0 голосов
/ 17 июня 2019

Я использую hibernate-jpa-2.0-api 1.0.0.Final и hibernate 3.5.5-Final.

У меня есть User и Role сущностей, каждая из которых имеет many-to-many взаимосвязь друг с другом (двунаправленная).

Отношения создают всего четыре таблицы, которые я сократил до трех таблиц.

Но все же мое требование не выполнено, я просто хочу управлять данными в двух таблицах.

Ответы [ 3 ]

0 голосов
/ 17 июня 2019

Я бы сказал, добавить fetch = FetchType.Lazy для отложенной загрузки, которая предпочтительна в большинстве сценариев, как показано ниже:

@ManyToMany(cascade = {
        CascadeType.ALL
    }, fetch = FetchType.LAZY)
    @JoinTable(name = "TABLE NAME WHERE RELATIONS ARE STORED",
        joinColumns = @JoinColumn(name = "ID_FIRST_TABLE"),
        inverseJoinColumns = @JoinColumn(name = "ID_SECOND_TABLE")
    )
private Set<Entity> entities;
0 голосов
/ 18 июня 2019

Каждый ответ здесь вроде как правильный, НО!ваш объект должен быть "рекурсивным".

Попробуйте это:

User.java


@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = "roles")
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private Long id;

    @Column
    private String username;

    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(name = "user_role",
            joinColumns = { @JoinColumn(name = "user_id") },
            inverseJoinColumns = { @JoinColumn(name = "role_id") })
    private List<Role> roles = new ArrayList<>();


    /*
    We need to add methods below to make everything work correctly.
    Use them to add or delete roles!!!
     */

    public void addRole(Role role) {
        roles.add(role);
        role.getUsers().add(this);
    }

    public void removeRole(Role role) {
        roles.remove(role);
        role.getRoles().remove(this);
    }

}

Role.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = "users")
@Table(name = "role")
public class Role{

    @Id
    @GeneratedValue
    @Column(name = "role_id")
    private Long id;

    @Column
    private String roleName;

    @ManyToMany(mappedBy="roles")
    private List<User> users = new ArrayList<>();

    /*
    We need to add methods below to make everything work correctly
     */

    public void addUser(User user) {
        users.add(user);
        user.getRoles().add(this);
    }

    public void removeUser(User user) {
        users.remove(user);
        user.getRoles().remove(this);
    }

}
0 голосов
/ 17 июня 2019

Вы можете управлять этим так:

@ManyToMany(cascade = {
        CascadeType.ALL
    })
    @JoinTable(name = "NAME OF YOUR TABLE WHERE RELATIONS ARE STORED",
        joinColumns = @JoinColumn(name = "ID_FIRST_TABLE"),
        inverseJoinColumns = @JoinColumn(name = "ID_SECOND_TABLE")
    )
private Set<Entity> entities;

РЕДАКТИРОВАТЬ: я забыл упомянуть, что вам нужно написать это только на одном из объектов, другой не нуждается в аннотации @JoinTable!

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