首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring如何存储关于两个实体之间关系的信息

Spring如何存储关于两个实体之间关系的信息
EN

Stack Overflow用户
提问于 2021-10-21 11:45:20
回答 2查看 57关注 0票数 0

我有两个具有这些字段的实体:

代码实体:

代码语言:javascript
复制
@Entity
@Table(name = "snippets")
@NoArgsConstructor
@Getter
@Setter
public class Code {

    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");

    @Id
    @GeneratedValue
    private Long id;
    private String code;
    private String date;
    private User author;
    private List<User> allowedUsers;

    public Code(CodeDto code) {
        this.code = code.getCode();
        this.date = LocalDateTime.now().format(formatter);
        this.author = code.getAuthor();
    }
}

用户实体:

代码语言:javascript
复制
@Entity
@Table(name = "users")
@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
public class User implements UserDetails {

    @Id
    @GeneratedValue
    private Long id;
    private String username;
    private String password;
    @Enumerated(EnumType.STRING)
    private UserRole userRole;
    @Transient
    private boolean locked;
    private boolean enabled = true;
    private List<Code> codeList;


    public User(String username, String password, UserRole userRole) {
        this.username = username;
        this.password = password;
        this.userRole = userRole;
    }
}

我正在尝试创建一个类似于github的应用程序(但当然非常简单)。我希望每个用户都能够添加代码片段,然后将访问权限授予其他用户。我希望存储谁是作者以及谁有权访问每个代码片段的信息。我怎样才能做到这一点呢?

EN

回答 2

Stack Overflow用户

发布于 2021-10-21 11:55:26

  • 每个代码都可以由一个用户列表来查看:可以用OneToMany来表示用户有一个代码列表:它也可以用一个OneToMany关系来表示。

这些关系可以用下面的代码来表示:

代码语言:javascript
复制
@OneToMany @JoinColumn(name = "code_id", referencedColumnName = "id")
private List<Code> codeList;

对另一个也可以这样做:

代码语言:javascript
复制
@OneToMany @JoinColumn(name = "user_id", referencedColumnName = "id")
private List<User> allowedUsers;
票数 0
EN

Stack Overflow用户

发布于 2021-10-22 17:56:50

我希望每个用户都能添加代码片段

我假设您实际上是指多个代码片段,这会更明智。要实现这一点,您需要在用户和代码之间建立一个OneToMany关联,为此,您需要使用@OneToMany。

您没有提到您正在使用的持久性提供程序,但至少对于Hibernate,我建议使用双向关系,以避免在添加代码时进行额外的更新查询。

当关系是双向的时,关系的@ManyToOne端,也就是所有者端,负责在实体的插入上填充外键列,更多的here

代码语言:javascript
复制
public class User implements UserDetails {
    ...
    @OneToMany(mappedBy = "writer")
    private Set<Code> codeList = new HashSet<>();

    public void addCode(Code code) {
        codeList.add(code);
        code.setWriter(this);
    }

    public void removeCode(Code code) {
        codeList.remove(code);
        code.setWriter(null);
    }

}

正如我们所说的,关联是双向的,因此在代码方面,您将拥有:

代码语言:javascript
复制
public class Code {
    ...
    @ManyToOne(fetch = FetchType.LAZY)
    private User writer;
}

PS1:我把list换成了set,因为它是推荐的,更多的here

PS2:处理双向OneToMany关系可能很棘手,例如,在我们的示例中忘记设置写入方将导致数据库中的外键为空。避免这种情况的一个很好的方法是使用helper方法来添加和删除子实体。

及更高版本将访问权限授予其他用户

为此,关联将是@ManyToMany,以便将其映射到数据库中的连接表:

代码语言:javascript
复制
public class Code {
    ...
    @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
    @JoinTable(name = "code_viewers",
        joinColumns = @JoinColumn(name = "code_id"),
        inverseJoinColumns = @JoinColumn(name = "viewer_id"))
    private Set<User> viewers = new HashSet<>();
}

再一次,你需要设置关系的另一边:

代码语言:javascript
复制
public class User implements UserDetails {
    ...
    @ManyToMany(mappedBy = "viewers")
    private Set<Code> accessibleCodes = new HashSet<>();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69661414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档