当前位置: 首页 > 知识库问答 >
问题:

使用JPA在桥接表上设置One To ManyJoins

西门嘉石
2023-03-14

我是JPA的新手...

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

  • 应用程序
  • 用户
  • User\u App\u桥

这些关系作为一对多基数映射到App和User之间的User\u App\u Bridge表(顾名思义,是一个桥)。

E-R图:

用户<--pl hd--0/><--pl hd--2/><--pl hd--1/>应用程序

1个用户与User\u App\u Bridge表中的许多应用程序关联。

1个应用程序与User\u App\u Bridge表中的许多用户关联。

User\u App\u 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
}

问题:

>

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

    在@JoinTable中应该列

    在inverseJoinColumns代码中,unique=true是否有必要(它的用途是什么)?

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

    感谢您抽出时间阅读此。。。

  • 共有1个答案

    景景胜
    2023-03-14

    您的问题答案:

    1.不,不是。您需要在User和UserAppBridge之间创建oneTo多国映射,以及App和UserAppBridge之间的oneTo多国映射。这是代码:

    在用户实体中:

        @OneToMany(mappedBy = "user")
        private Set<UserAppBridge> userAppBridgeSet;
    

    应用内实体:

        @OneToMany(mappedBy = "app")
        private Set<UserAppBridge> userAppBridgeSet;
    

    在UserAppBridge实体中:

        @Entity
        @IdClass(UserAppBridgeId.class)
        public class UserAppBridge{
    
            @Id
            @Column(name = "User_App_Bridge_Id")             
            private long userAppBridgeId;
    
            @Id
            @Column(name = "User_Id")
            private long userId;
    
            @Id
            @Column(name = "App_Id")
            private long appId;
    
            @ManyToOne
            @PrimaryKeyJoinColumn(name="User_Id", referencedColumnName="User_Id")
            private User user;
    
            @ManyToOne  
            @PrimaryKeyJoinColumn(name="App_Id", referencedColumnName="App_Id")  
            private App app;
    
            // Getters & Setter methods
        }
    

    在UserAppBridgeId类中:

        public class UserAppBridgeId{
    
            private long userAppBridgeId;
            private int userId;
            private int appId;  
    
            // Getters & Setter methods 
        }
    

    有关如何创建高级多对多关系的更多信息,请参阅wiki链接

    它应该是一个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;
    

    如果有一个唯一=真属性,映射表只能有唯一的App_id(相同的App_id不能在映射表中出现一次),而它可以有任何User_id(相同的User_id可以在映射表中出现一次)。这意味着一个User_id可能分配了更多App_id,而一个App_id可能只分配了一个User_id。因此,您强制建立一对多关系。

     类似资料:
    • 本文向大家介绍VMware设置桥接上网(图文详解),包括了VMware设置桥接上网(图文详解)的使用技巧和注意事项,需要的朋友参考一下 环境:主机Win7、VMware Workstation 6.5.3、虚拟机Ubuntu10.04。 一、桥接的基本原理 配置成桥接网络连接模式的虚拟机就当作主机所在以太网的一部分,虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑,可以像主机一样可以访

    • 桥接(Bridge) Intent 将抽象与实现分离开来,使它们可以独立变化。 Class Diagram Abstraction:定义抽象类的接口 Implementor:定义实现类接口 Implementation RemoteControl 表示遥控器,指代 Abstraction。 TV 表示电视,指代 Implementor。 桥接模式将遥控器和电视分离开来,从而可以独立改变遥控器或者电

    • 我已经做了什么: > 在Weblogic 11g节点上配置的JMS服务器 配置的外部服务器-AMQ连接工厂和绑定到本地JNDI的源队列对象(OK:Conn.工厂和队列对象可见于服务器JNDI树中) 用默认道具创建JMS桥(好吧-我想) 使用默认配置为目标目的地(Weblogic)创建了桥接目的地--在可能的情况下(OK:部署了资源适配器) 为源目标(AMQ)创建了桥接目标-JNDI属性,在可能的情

    • 问题内容: 该EclipseLink的文件说,我需要在我的pom.xml与Maven得到它下面的条目: 但是当我尝试使用注释时,NetBeans告诉我,找不到该类。确实如此:Eclipselink的javax.persistence包中没有Entity类。 我必须如何使用Maven设置Eclipselink? 问题答案: 该工件不提供JPA 2.0 API ,您需要添加: 为了简单起见,我建议使用

    • 目前,我们使用JNDI的Tomcat配置基于这一建议,该建议目前正在发挥作用。 如何使用JMS和JNDI连接到WebSphere MQ(MQ系列)服务器? 由于我们正在升级到v8,我想利用JMS 2.0特性。这需要将jar文件更新到JMS 2.0版本。 因此,我从tomcat lib文件夹中删除了以下JAR。 com。ibm。mq。jar 用这些罐子代替了它们。根据这个链接 com。ibm。mq。