Reputation: 503
@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
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