Java 使用JPA针对桥接表设置一对多连接

Java 使用JPA针对桥接表设置一对多连接,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我是JPA的新手 我在MySQL 5数据库中预先存在以下表: 应用程序 使用者 用户应用程序桥 这些关系作为一对多基数映射到应用程序和用户之间的User_App_Bridge表(顾名思义,是一个桥) E-R图: 用户------用户应用程序------网桥------应用程序 1个用户与User_App_Bridge表中的许多应用程序关联 1应用程序与User_App_Bridge表中的许多用户关联 用户应用程序桥接表的DDL: CREATE TABLE `User_App_Bridge`

我是JPA的新手

我在MySQL 5数据库中预先存在以下表:

  • 应用程序
  • 使用者
  • 用户应用程序桥
这些关系作为一对多基数映射到应用程序和用户之间的User_App_Bridge表(顾名思义,是一个桥)

E-R图:

用户------用户应用程序------网桥------应用程序

1个用户与User_App_Bridge表中的许多应用程序关联

1应用程序与User_App_Bridge表中的许多用户关联

用户应用程序桥接表的DDL:

CREATE TABLE `User_App_Bridge` (
    `User_App_Bridge_Id` int(11) NOT NULL AUTO_INCREMENT,
    `User_Id` int(11) NOT NULL,
    `App_Id` int(11) NOT NULL,
    PRIMARY KEY (`User_App_Bridge_Id`),
    KEY `App_Id` (`App_Id`),
    KEY `User_Id` (`User_Id`),
    CONSTRAINT `user_app_bridge_ibfk_1` FOREIGN KEY (`App_Id`) REFERENCES `App` (`App_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
假设我有以下映射到这些表的JPA注释类:

@Entity
public class App {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "App_Id")
    private long appId;

    @OneToMany
    @JoinTable
    (
        name = "UserAppBridge",
        joinColumns = { @JoinColumn(name="App_Id", referencedColumnName = "App_Id") },
        inverseJoinColumns = { @JoinColumn(name="User_Id", referencedColumnName = "User_Id") }
    )
    private List<User> users;

    @Column(name = "App_Name")
    private String appName;

    // Getters & Setter methods
}

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "User_Id")
    private long userId;

    @OneToMany
    @JoinTable
    (   
       name = "UserAppBridge",
       joinColumns = { @JoinColumn(name="User_Id", referencedColumnName = "User_Id") },
       inverseJoinColumns = { @JoinColumn(name="App_Id", referencedColumnName = "App_Id", unique = true) }
    )
    private List<App> apps;

    @Column(name = "User_Name")
    private String userName;

    // Getters & Setter methods
}

@Entity
public class UserAppBridge {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "User_App_Bridge_Id")
    private long userAppBridgeId;

    @Column(name = "User_Id")
    private long userId;

    @Column(name = "App_Id")
    private long appId;

    // Getters & Setter methods
}
@实体
公共类应用程序{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“App\u Id”)
私有长appId;
@独身癖
@可接合
(
name=“UserAppBridge”,
joinColumns={@JoinColumn(name=“App\u Id”,referencedColumnName=“App\u Id”)},
inverseJoinColumns={@JoinColumn(name=“User\u Id”,referencedColumnName=“User\u Id”)}
)
私人名单用户;
@列(name=“App\u name”)
私有字符串appName;
//getter和Setter方法
}
@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“User\u Id”)
私有长用户ID;
@独身癖
@可接合
(   
name=“UserAppBridge”,
joinColumns={@JoinColumn(name=“User\u Id”,referencedColumnName=“User\u Id”)},
inverseJoinColumns={@JoinColumn(name=“App\u Id”,referencedColumnName=“App\u Id”,unique=true)}
)
私人列表应用程序;
@列(name=“User\u name”)
私有字符串用户名;
//getter和Setter方法
}
@实体
公共类UserAppBridge{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“User\u App\u Bridge\u Id”)
私有长userAppBridgeId;
@列(name=“User\u Id”)
私有长用户ID;
@列(name=“App\u Id”)
私有长appId;
//getter和Setter方法
}
问题:

  • 这(@JoinTable中的块)是使用UserAppBridge为用户和应用实体进行一对多映射的正确方法吗

  • 在@JoinTable中,是否应将列&referencedColumnName分配给SQL值(例如name=“User\u Id”,referencedColumnName=“User\u Id”) 或者应该是Java引用名称(例如name=“userId”,referencedColumnName=“userId”)

  • 在inverseJoinColumns代码中,unique=true是必需的(它的用途是什么)

  • 我是否需要在UserAppBridge类中执行其他操作(用于连接到应用程序和用户)


  • 感谢您抽出时间阅读此…

    您的问题的答案:

    不,不是。您需要在用户和UserAppBridge之间创建一个oneToMany映射,并在App和UserAppBridge之间创建一个oneToMany映射。代码如下:

    在用户实体中:

        @OneToMany(mappedBy = "user")
        private Set<UserAppBridge> userAppBridgeSet;
    
    在UserAppBridgeId类中:

        public class UserAppBridgeId{
    
            private long userAppBridgeId;
            private int userId;
            private int appId;  
    
            // Getters & Setter methods 
        }
    
    有关如何创建高级多人关系的更多信息,请参阅

  • 它应该是一个SQL名称

  • 有了“unique=true”,你就是在强迫一对夫妻的关系,没有了“unique=true”,你会有很多

  • 说明: 下面是一段代码:

        @OneToMany
        @JoinTable{
            //Here should be the table name and not the entity name
            name = "User_App_Bridge",
            joinColumns = { @JoinColumn(name="User_Id", referencedColumnName = "User_Id") }, 
            inverseJoinColumns = { @JoinColumn(name="App_Id", referencedColumnName = "App_Id", unique = true) }
        }
        private List<App> apps;
    
    @OneToMany
    @可接合{
    //这里应该是表名,而不是实体名
    name=“User\u App\u Bridge”,
    joinColumns={@JoinColumn(name=“User\u Id”,referencedColumnName=“User\u Id”)},
    inverseJoinColumns={@JoinColumn(name=“App\u Id”,referencedColumnName=“App\u Id”,unique=true)}
    }
    私人列表应用程序;
    
    如果有“unique=true”属性,则映射表只能有唯一的App\u id(同一App\u id在映射表中不能出现多次),而可以有任何用户id(同一用户id在映射表中可以出现多次)。这意味着,一个用户id可能分配了多个应用id,而单个应用id可能只分配了一个用户id。因此,您强制建立一个oneToMany关系

  • 是的,你知道。如答案1所示,您必须为UserAppBridge实体创建一个Id类,并为用户和应用实体添加一个映射

  • 回答您的问题:

    不,不是。您需要在用户和UserAppBridge之间创建一个oneToMany映射,并在App和UserAppBridge之间创建一个oneToMany映射。代码如下:

    在用户实体中:

        @OneToMany(mappedBy = "user")
        private Set<UserAppBridge> userAppBridgeSet;
    
    在UserAppBridgeId类中:

        public class UserAppBridgeId{
    
            private long userAppBridgeId;
            private int userId;
            private int appId;  
    
            // Getters & Setter methods 
        }
    
    有关如何创建高级多人关系的更多信息,请参阅

  • 它应该是一个SQL名称

  • 有了“unique=true”,你就是在强迫一对夫妻的关系,没有了“unique=true”,你会有很多

  • 说明: 下面是一段代码:

        @OneToMany
        @JoinTable{
            //Here should be the table name and not the entity name
            name = "User_App_Bridge",
            joinColumns = { @JoinColumn(name="User_Id", referencedColumnName = "User_Id") }, 
            inverseJoinColumns = { @JoinColumn(name="App_Id", referencedColumnName = "App_Id", unique = true) }
        }
        private List<App> apps;
    
    @OneToMany
    @可接合{
    //这里应该是表名,而不是实体名
    name=“User\u App\u Bridge”,
    joinColumns={@JoinColumn(name=“User\u Id”,referencedColumnName=“User\u Id”)},
    inverseJoinColumns={@JoinColumn(name=“App\u Id”,referencedColumnName=“App\u Id”,unique=true)}
    }
    私人列表应用程序;
    
    如果有“unique=true”属性,则映射表只能有唯一的App\u id(同一App\u id在映射表中不能出现多次),而可以有任何用户id(同一用户id在映射表中可以出现多次)。这意味着,一个用户id可能分配了多个应用id,而单个应用id可能只分配了一个用户id。因此,您强制建立一个oneToMany关系

  • 是的,你知道。如答案1所示,您必须为UserAppBridge实体创建一个Id类,并为用户和应用实体添加一个映射

  • 非常感谢你。。。因此,基本上,我从我的应用程序和用户类中删除了@JoinTable部分(按照您的指示)。。。考虑到dat