是JPA的新手...

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


应用程式
用户
User_App_Bridge


该关系作为一对多基数映射到应用程序和用户之间的User_App_Bridge表(顾名思义,是桥梁)。

E-R图:

用户------ User_App_Bridge ------应用

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

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

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
}


问题:


这(@JoinTable中的块)是使用UserAppBridge对用户和应用实体进行一对多映射的正确方法吗?
在@JoinTable内部,应该将列&referencedColumnName分配给SQL值(例如,name =“ User_Id”,referencedColumnName =“ User_Id”)
还是Java参考名称(例如,name =“ userId”,referencedColumnName =“ userId”)?
在inverseJoinColumns代码黑色内部,唯一= true是否必要(这是什么意思)?
我需要在UserAppBridge类内进行其他操作(用于连接到App和User)吗?


感谢您抽出时间来阅读...

最佳答案

您的问题的答案:

1.不,不是。您需要在User和UserAppBridge之间创建oneToMany映射,并在App和UserAppBridge之间创建oneToMany映射。这是代码:

在用户实体中:

    @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
    }


有关如何创建高级manyToMany关系的更多信息,请参见wiki link


应该是一个SQL名字
使用“ unique = true”,您将强制一个oneToMany关系,如果没有“ unique = true”,则将是manyToMany。


说明:
让我们看下面的代码:

    @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;


如果存在“ unique = true”属性,则您的映射表只能具有唯一的App_id(相同的App_id不能在映射表中多次出现,而可以有任何User_id(相同的User_id可以在映射表中多次出现)表)。这意味着一个User_id可能分配了更多的App_id,而单个App_id可能仅分配了一个User_id。因此,您强制一个一对多关系。


是的你是。如答案1所示,您将必须为UserAppBridge实体创建一个ID类,并为User和App实体添加一个映射

07-25 23:18