没有第三个表的Hibernate很多很多

时间:2016-02-10 05:19:35

标签: hibernate

我有两个表(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>();

我试图在不使用第三个表(链接表)的情况下在两个表之间建立连接。我使用休眠时可以吗?

1 个答案:

答案 0 :(得分:2)

对于多对多关系,它不能像其他两个表中的键一样具有连接表。 hibernate annotaion只是现有ERD的映射

这是文档

打开声明javax.persistence.ManyToMany

@Target(value = {METHOD,FIELD}) @Retention(值= RUNTIME)

定义具有多对多多重性的多值关联。

每个多对多关联都有两个方面,即拥有方和非拥有方,或反方。连接表是在拥有方指定的。如果关联是双向的,则任何一方都可以被指定为拥有方。如果关系是双向的,则非拥有方必须使用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 Persistence 1.0