piedpipr
piedpipr

Reputation: 503

Add extra custom column to auto mapped Table in Spring JPA ManyToMany

@Getter @Setter @NoArgsConstructor @AllArgsConstructor
@Table(name = "my_users")
public class MyUsers {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(nullable = false)
    private Long id;

    @Column(nullable = false, unique = true)
    private String userName;
    private String password;

    @ManyToMany
    private List<MyUsers> connections;
}

This is my MyUsers Model Class. I am using Hibernate and MySQL.

    @ManyToMany
    private List<MyUsers> connections;

This ManyToMany relationship is automatically creating the table 'my_users_connections' with 'my_users_id' and 'connections_id' colums. How can I add extra columns to this auto mapped table?

Upvotes: 1

Views: 696

Answers (1)

K.Nikita
K.Nikita

Reputation: 619

It's not ideal solution...

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "my_users")
public class MyUsers implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(nullable = false)
    private Long myUsersId;

    @Column(nullable = false, unique = false)
    private String userName;
    private String password;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "my_users_connections",
            joinColumns = { @JoinColumn(name = "my_users_id") },
            inverseJoinColumns = { @JoinColumn(name = "connections_id") })
    private List<MyUsers> connections;
}

Create embedded id MyUsersConnectionsPK:

@Data
@Embeddable
public class MyUsersConnectionsPK implements Serializable {

    @Column(name = "my_users_id")
    private Long myUsersId;

    @Column(name = "connections_id")
    private Long connectionsId;

}

Create MyUsersConnections, which represent ManyToMany

@Data
@Entity
@Table(name = "my_users_connections")
public class MyUsersConnections implements Serializable {

    @EmbeddedId
    private MyUsersConnectionsPK id;

    @ManyToOne
    @MapsId("my_users_id")
    @JoinColumn(name = "my_users_id")
    private MyUsers myUsersId;

    @ManyToOne
    @MapsId("connections_id")
    @JoinColumn(name = "connections_id")
    private MyUsers connectionsId;

    @Column(name = "extra_column")
    private String extraColumn;
}

Create JPA repository

@Repository
public interface MyUsersConnectionsRepository extends JpaRepository<MyUsersConnections, MyUsersConnectionsPK> {

    List<MyUsersConnections> findMyUsersConnectionsByMyUsersIdMyUsersId(Long id);
}

And simple sample for using:

@Service
public class Test {

    @Autowired
    private MyUsersConnectionsRepository myUsersConnectionsRepository;

    @Autowired
    private MyUsersRepository myUsersRepository;

    public void test() {
        MyUsers myUsers = new MyUsers();
        myUsers.setUserName("user name");
        myUsers.setPassword("password");
        MyUsers myUsers2 = new MyUsers();
        myUsers2.setUserName("user name 2");
        myUsers2.setPassword("password 2");
        myUsers.setConnections(Collections.singletonList(myUsers2));
        myUsers = myUsersRepository.saveAndFlush(myUsers);
        List<MyUsersConnections> myUsersConnections = myUsersConnectionsRepository.findMyUsersConnectionsByMyUsersIdMyUsersId(myUsers.getMyUsersId());
        MyUsersConnections item = myUsersConnections.get(0);
        item.setExtraColumn("Extra column");
        myUsersConnectionsRepository.saveAndFlush(item);
    }
}

Upvotes: 1

Related Questions