我有两个表(Users 和 UserRole)
create table Users (
UserId serial not null,
UserName varchar(100) not null,
UserType varchar(15) not null,
Constraint PK_Users primary key (UserId)
)
;
CREATE TABLE UserRole
(
RoleId serial not null,
RoleType varchar(20) not null,
AccessTo varchar(100) not null,
CONSTRAINT PK_UserRoleId PRIMARY KEY (RoleId)
)
;
insert into Users (default,'Raj','Admin');
insert into Users (default,'Kumar','Internal');
insert into Users (default,'Ramesh','Internal');
insert into Users (default,'Muthu','External');
insert into Users (default,'Sundar','External');
insert into UserRole (default, 'Admin','/**');
insert into UserRole (default, 'Internal','/parking/*');
insert into UserRole (default, 'Internal','/vehciles/*');
insert into UserRole (default, 'External','/Upload/*');
insert into UserRole (default, 'External','/ViewParkings/*');
//以下连接语法不起作用
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "UserRole",
JoinColumns(
{
JoinColumn(updatable=false,insertable=false, name="UserType"
, referencedColumnName="RoleType"),
}
private Set<UserRole> userRoles = new HashSet<userRoles>();
我正在尝试在两个表之间建立连接而不使用第三个表(链接表)。当我使用 hibernate 时可以吗?
最佳答案
对于多对多关系,它不是这样工作的,您必须有一个包含其他两个表中的键的连接表。 hibernate注解只是现有ERD的映射
这是文档
开放声明javax.persistence.ManyToMany
@Target(值={方法,字段}) @Retention(值=运行时)
定义具有多对多多重性的多值关联。
每个多对多关联都有两个方面,即拥有方和非拥有方(或反向方)。连接表在拥有方指定。如果关联是双向的,则任何一方都可以被指定为拥有方。如果关系是双向的,则非拥有方必须使用ManyToMany注释的mappedBy元素来指定拥有方的关系字段或属性。
关系的连接表(如果没有默认)是在拥有方指定的。
ManyToMany 注释可以在实体类中包含的可嵌入类中使用,以指定与实体集合的关系。如果关系是双向的,并且包含可嵌入类的实体是该关系的所有者,则非拥有方必须使用 ManyToMany 注释的mappedBy 元素来指定可嵌入类的关系字段或属性。在mappedBy 元素中必须使用点(“.”)表示法语法来指示嵌入属性内的关系属性。与点符号一起使用的每个标识符的值是相应嵌入字段或属性的名称。
Example 1:
// In Customer class:
@ManyToMany
@JoinTable(name="CUST_PHONES")
public Set<PhoneNumber> getPhones() { return phones; }
// In PhoneNumber class:
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() { return customers; }
Example 2:
// In Customer class:
@ManyToMany(targetEntity=com.acme.PhoneNumber.class)
public Set getPhones() { return phones; }
// In PhoneNumber class:
@ManyToMany(targetEntity=com.acme.Customer.class, mappedBy="phones")
public Set getCustomers() { return customers; }
Example 3:
// In Customer class:
@ManyToMany
@JoinTable(name="CUST_PHONE",
joinColumns=
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
inverseJoinColumns=
@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
)
public Set<PhoneNumber> getPhones() { return phones; }
// In PhoneNumberClass:
@ManyToMany(mappedBy="phones")
public Set<Customer> getCustomers() { return customers; }
自: Java持久化1.0
关于Hibernate 多对多,没有第三张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35307406/