Java 使用JPA针对桥接表设置一对多连接
我是JPA的新手 我在MySQL 5数据库中预先存在以下表: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`
- 应用程序
- 使用者
- 用户应用程序桥
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方法
}
问题:
感谢您抽出时间阅读此…您的问题的答案: 不,不是。您需要在用户和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
}
有关如何创建高级多人关系的更多信息,请参阅
@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关系
回答您的问题: 不,不是。您需要在用户和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
}
有关如何创建高级多人关系的更多信息,请参阅
@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关系
非常感谢你。。。因此,基本上,我从我的应用程序和用户类中删除了@JoinTable部分(按照您的指示)。。。考虑到dat