【问题标题】:Hibernate @ManyToMany association table with extra field that can be queried differentlyHibernate @ManyToMany 关联表,带有可以以不同方式查询的额外字段
【发布时间】:2021-07-05 01:22:40
【问题描述】:

我试图做 @ManyToMany 关联,当我尝试做类似的关系时它起作用了

用户可以有多个组,一个组可以有多个用户..它可以工作,并且hibernate会自动基于它创建自定义表并完成它的工作。后来我不得不在关联表中添加更多列,所以我按照一篇文章进行了设置,效果很好。

我正在使用 SpringBoot 并且正在使用 SpringDataJPA

这是我的实现:

    @Entity
@Table(name = "USERS")
public class User {

    @Id
    @GeneratedValue
    private long id;
    private String username;
    private String password;
    private String email;  

    @OneToMany(mappedBy = "user")
    private Set<UserGroup> userGroups = new HashSet<UserGroup>();
}

@Entity
@Table(name = "GROUPS")
public class Group {

    @Id
    @GeneratedValue
    private long id;
    private String name;
 
    @OneToMany(mappedBy = "group")
    private Set<UserGroup> userGroups = new HashSet<UserGroup>();
     
}


@Entity
@Table(name = "USERS_GROUPS")
public class UserGroup {

    @Id
    @GeneratedValue
    private long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "USER_ID")  
    private User user;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "GROUP_ID")
    private Group group;
     
    // additional fields
    private boolean activated;
    private Date registeredDate;
 }


User user = new User("tommy", "ymmot", "tommy@gmail.com");
Group group = new Group("Coders");

User persistedUser = userRepository.save(user);
Group persistedGroup = groupRepositry.save(group);
 
UserGroup userGroup = new UserGroup();
userGroup.setGroup(persistedGroup);
userGroup.setUser(persistedUser);
userGroup.setActivated(true);
userGroup.setRegisteredDate(new Date());
 
userGroupRepository.save(userGroup);

现在如何编写一个 SpringData 等价的方法名来获取用户的 用户活跃的组?即我让用户活跃=假 有人从组中删除用户,而不是从中删除条目 user_group 关联表。

我们可以在 userRepository 上做吗?

【问题讨论】:

    标签: java spring-boot hibernate spring-data-jpa many-to-many


    【解决方案1】:

    我认为您希望拥有与此类似的存储库:

    public interface UserGroupRepository extends JpaRepository<UserGroup, Long> {
    
        List<UserGroup> findAllByUserAndActivatedIsTrue(User user);
    
    }
    

    此方法将为您提供该用户分配到并处于活动状态的所有组的列表。 如果您想参数化也激活的字段,您应该改用
    List&lt;UserGroup&gt; findAllByUserAndActivated(User user, boolean activated);

    我希望这对您有所帮助。祝你好运。

    顺便说一句,我建议阅读以下内容:
    https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
    很有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2016-06-09
      • 2010-12-19
      • 1970-01-01
      相关资源
      最近更新 更多