是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实体添加一个映射