有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpringJPA多列内部联接

我对SpringJPA还是新手,我在尝试在一个实体上使用两列进行内部连接时遇到了一个问题

我有这些桌子

CREATE TABLE event (
id bigint unsigned auto_increment primary key comment 'id of the event',
user_id bigint unsigned not null comment 'id of the user',
organizer_id bigint unsigned not null comment 'id of the organizer user'
);

CREATE TABLE user (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 'user id',
email VARCHAR(256) NOT NULL COMMENT 'user email',
name VARCHAR(32) NOT NULL COMMENT  'user name',
surname VARCHAR(64) NOT NULL COMMENT 'user surname'
)

这件事发生在哪里。用户id和事件。组织者id映射到用户。身份证

我还让这些实体映射这些表

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String email;
    private String name;
    private String surname;

    @OneToMany(mappedBy = "user")
    private List<Event> events;
}

@Entity
public class Event {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "organizer_id", nullable = false)
    private User organizer;
}

其思想是在用户列表中获取用户的所有事件,其中用户id由事件表上的用户id或组织者id映射

我曾尝试使用多个@joinColumn注释(并从@manyToOne()中删除mappedBy),但遇到了以下错误:

组织。冬眠AnnotationException:外键引用的列数错误。应该是1

我找到的唯一解决方案是将它放在其他列表中以便使用,但我确信我缺少正确的方法,因为它应该是一个非常常见的用例

提前多谢


共 (1) 个答案

  1. # 1 楼答案

    The idea is to get in the List of the user all the events of the user where the user id is mapped by user_id or organizer_id on events table.

    JPA是数据库中实体的表示,在检索数据库中的内容后,您的需求需要进行后处理

    I'm missing the correct way of doing it as it should be a very common use case.

    在JPA级别,将两个不同的关系“合并”到一个集合中并不是很常见的用例

    所以,一种方法是:

    @Entity
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
        private String email;
        private String name;
        private String surname;
    
        @OneToMany(mappedBy = "user")
        private List<Event> userEvents;
    
        @OneToMany(mappedBy = "organizer")
        private List<Event> organizerEvents;
    }