Hibernate 多对多,没有第三张表

标签 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>();

我正在尝试在两个表之间建立连接而不使用第三个表(链接表)。当我使用 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/

相关文章:

hibernate - Grails 在运行时更改数据源

java - em.persist 似乎不会在 postgreSQL 数据库上保留数据

java - 如何在 hql/hibernate 中的值集中使用 equals?

java - JPA+Hibernate+@Transactional注解的spring事务支持的奇怪行为

java - 多个数据库的事务管理器

java - Spring 启动 hibernate : cannot delete child object separately

java - 如何在hibernate.cfg.xml中连接postgresql

Spring 3.1 + Hibernate 4 - HibernateTemplate

java - 分离的实体未正确合并?

java - SQL 中的日期选择错误