天道酬勤,学无止境

Hibernate : How to Join 3 tables in one join table by Annotation?

I have some roles, users and applications I want to create a mapping hibernate of this table :

CREATE TABLE role_application_user (
  role_identifier INTEGER not null,
  application_identifier INTEGER not null,
  user_identifier INTEGER not null,
  KEY FK_role_identifier (role_identifier),
  KEY FK_application_identifier(application_identifier),
  KEY FK_user_identifier (user_identifier),
  CONSTRAINT FK_role_identifier FOREIGN KEY (role_identifier) REFERENCES role (identifier),
  CONSTRAINT FK_application_identifier FOREIGN KEY (application_identifier) REFERENCES application (identifier),
  CONSTRAINT FK_user_identifier FOREIGN KEY (user_identifier) REFERENCES users (login)
);

for an application, a role can have many users and a user can of many roles.

I try this mapping :

Application.java

@JoinTable(name = "role_application_user",
           joinColumns = @JoinColumn(name = "application_identifier"),
           inverseJoinColumns = @JoinColumn(name = "user_identifier"))
@MapKeyJoinColumn(name = "role_identifier")
@ElementCollection
private Map<Role, User> userByRole = new HashMap<>();

Unfortunately, this is not working in my case because in java, the key of a Map must be unique.

With this mapping, we can have only one user for a role and an application.

评论

try this implementation :

    @Entity
    public class User {
        @OneToMany
        private List<RoleInApplication> rolesInApplications;
    }
    
    @Entity
    public class Role {
        @OneToMany
        private List<RoleInApplication> rolesInApplications;
    }
    
    @Entity
    public class RoleInApplication {
        @ManyToOne
        private User user;
        @ManyToOne
        private Role role;
        @ManyToOne
        private Application application;
    }
    
    @Entity
    public class Application {
        @OneToMany
        private List<RoleInApplication> rolesInApplications;
    }

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Hibernate: How to Join three 3 tables in one join table in Annotation?
    Can you please help me how to join three tables with one common join table? I have USER, APPLICATION, and ROLE tables. And I want thier IDs to be joined in a table named USER_APP_ROLE(user.ID, application.ID, role.ID). When I remove either Application or Role tables in Join Many to Many my code is working. I have done the following codes: User.java @ManyToMany (targetEntity=Role.class) @JoinTable(name="USER_APPLICATION_ROLE", joinColumns=@JoinColumn(name="USER_ID"), inverseJoinColumns=@JoinColumn(name="ROLE_ID")) private Collection<Role> roles; @ManyToMany (targetEntity=Application.class)
  • Hibernate 3.5中的@OrderColumn批注(@OrderColumn annotation in Hibernate 3.5)
    问题 我正在尝试在Hibernate 3.5中使用@OrderColumn批注 @OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL) @OrderColumn(name = "pos") private List<Children> childrenCollection; 检索数据时,一切正常。 但是我无法使其重新排序列表中的元素并将新的订单保存到数据库中。 回答1 Hibernate不支持@OneToMany(mappedBy =“ ...”)和@OrderColumn的组合。 此JIRA问题跟踪使用此无效组合时引发更明显错误消息的请求:http://opensource.atlassian.com/projects/hibernate/browse/HHH-5390 我认为主要由于它是一种奇怪的关系模式而不受支持。 上面的注释指示关系的“一个”侧确定如何将关系刷新到数据库,但是通过检查列表,顺序/位置仅在“许多”侧可用。 “多”方拥有这种关系更有意义,因为该方既了解元素的隶属关系又了解元素的顺序。 Hibernate Annotations文档详细描述了这种情况: http://docs.jboss.org/hibernate/stable/annotations
  • Spring/JPA/Hibernate 如何在一个存储库中执行两个实体的连接(Spring/JPA/Hibernate How to Perform Join of Two Entities In One Repository)
    问题 首先假设我们有两张桌子。 一张表是Employee表,包含以下列: EMPLOYEE: ------------------------ emp_id (int, primary key) emp_name (varchar(125)) emp_dept (foreign key) emp_intro (text) 另一个表是具有以下列的部门表: DEPARTMENT: ----------- dept_id (int, primary key) dept_label (varchar(25)) 这是表的值的示例 DEPARTMENT: ------------------------ dept_id | dept_label ------------------------ 1 | Sales ------------------------ 2 | Technology ------------------------ 3 | Finance 为了返回带有状态标签的员工信息,我们需要执行 JOIN: SELECT e, d.dept_label FROM employees JOIN department d ON d.dept_id = e.emp_dept 或多表选择: SELECT e.emp_id, e.emp_name, d.dept_label, e.emp
  • 什么是@JoinColumn 以及它在 Hibernate 中的使用方式(what is @JoinColumn and how it is used in Hibernate)
    问题 我已经阅读了很多关于@JoinColumn 的书,但我仍然不明白它背后的想法。 病人表 CREATE TABLE patient ( patient_id BIGINT NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, PRIMARY KEY(patient_id)); 车辆表 CREATE TABLE vehicles ( patient_id BIGINT NOT NULL, vehicle_id BIGINT NOT NULL, vehicle_manufacturer VARCHAR(255), PRIMARY KEY (vehicle_id), CONSTRAINT patienthasmanyvehicle FOREIGN KEY(patient_id) REFERENCES patient(patient_id)); 病人班 @OneToMany(mappedBy = "patient") private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 车辆等级 @ManyToOne @JoinColumn(name="patient_id") private Patient
  • Hibernate:在涉及外键的复合主键星座中,insertable = false,updatable = false在哪里?(Hibernate: Where do insertable = false, updatable = false belong in composite primary key constellations involving foreign keys?)
    问题 在Hibernate或其他ORM中实现组合主键时,在使用标识关系(作为PK一部分的FK)的组合主键星座中,最多将三个位置放置insertable = false,updatable = false。 进入复合PK类的@Column注释(仅@Embeddable类)或进入实体类的关联@ JoinColumn / s注释或进入实体类的冗余PK属性的@Column注释(仅@IdClass类) 第三种是使用@IdClass和JPA 1.0 AFAIK的唯一方法。 请参阅http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_Relationships。 我将仅考虑情况1.和2。 问:通常将“ insertable = false,可更新= false”放在哪个位置是首选方法? 我在这个问题上遇到了Hibernate的问题。 例如,Hibernate 3.5.x会抱怨Zips表 CREATE TABLE Zips ( country_code CHAR(2), code VARCHAR(10), PRIMARY KEY (country_code, code), FOREIGN KEY (country_code) REFERENCES
  • Spring/JPA/Hibernate How to Perform Join of Two Entities In One Repository
    First let's say we have two tables. One table is an Employee table with the following columns: EMPLOYEE: ------------------------ emp_id (int, primary key) emp_name (varchar(125)) emp_dept (foreign key) emp_intro (text) The other table is a Department table with the following columns: DEPARTMENT: ----------- dept_id (int, primary key) dept_label (varchar(25)) Here is a sample of the table's values DEPARTMENT: ------------------------ dept_id | dept_label ------------------------ 1 | Sales ------------------------ 2 | Technology ------------------------ 3 | Finance In order to return the
  • MappedBy 双向 @ManyToMany :原因是什么(MappedBy in bi-directional @ManyToMany : what is the reason)
    问题 在双向多对多关系中设置 MappedBy 的原因是什么? 当一个表有大量记录,而另一个表有一些记录时,哪一侧放置mappedBy更好? 回答1 这实际上是一个很好的问题,它有助于理解“拥有”实体的概念。 如果你想防止双方(在双向关系中)有join tables ,一个好主意,那么你需要在一侧有一个mappedBy=元素。 是否有join table由@ManyToMany注释的mappedBy="name"元素@ManyToMany 。 ManyToMany 注释的 mappingBy 的 Javadoc 说: 拥有关系的字段。 除非关系是单向的,否则是必需的。 对于您的(双向)示例,如果只有两个@ManyToMany注释并且没有@ManyToMany mappedBy=元素,则默认情况下将有两个Entity表和两个Join Tables : Hibernate: create table SideA (id bigint not null, primary key (id)) Hibernate: create table SideA_SideB (sidea_id bigint not null, sidebs_id bigint not null, primary key (sidea_id, sidebs_id)) Hibernate: create table
  • Hibernate - Is there a way to join 2 columns against 1?
    I'm developing webapp using Spring & Hibernate. Table 1: BaseTable +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | Id | bigint(20) | NO | PRI | | auto_increment | | Serial1 | varchar(255) | YES | | NULL | | | Serial2 | varchar(255) | YES | | NULL | | | ModelNum | varchar(255) | YES | | NULL | | | ... | .... | .. | 0 | | | +------------+--------------+------+-----+---------+----------------+ Table 2: DetailTable +------------+--------------+------+-----+-
  • 多对多休眠反面被忽略(Many to Many hibernate inverse side ignored)
    问题 您好,我正在阅读休眠文档。 http://docs.jboss.org/hibernate/annotations/3.5/reference/zh/html/entity.html 使用@ManyToMany批注在逻辑上定义了多对多关联。 您还必须使用@JoinTable批注描述关联表和连接条件。 如果关联是双向的,则一侧必须是所有者,而一侧必须是反向端(即,在更新关联表中的关系值时,它将被忽略): 我了解除了最后一件事 (即,在更新关联表中的关系值时,它将被忽略)。 这是什么意思? 例子? 回答1 假设您具有以下实体: @Entity public class Student { @ManyToMany private Set<Course> courses; ... } @Entity public class Course { @ManyToMany(mappedBy = "courses") private Set<Student> students; ... } 所有者方是Student(因为它没有mappedBy属性)。 反面是Course((因为它具有mappedBy属性)。 如果您执行以下操作: Course course = session.get(Course.class, 3L); Student student = session.get
  • Hibernate - 有没有办法将 2 列加入 1 列?(Hibernate - Is there a way to join 2 columns against 1?)
    问题 我正在使用 Spring 和 Hibernate 开发 webapp。 表 1:基表 +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | Id | bigint(20) | NO | PRI | | auto_increment | | Serial1 | varchar(255) | YES | | NULL | | | Serial2 | varchar(255) | YES | | NULL | | | ModelNum | varchar(255) | YES | | NULL | | | ... | .... | .. | 0 | | | +------------+--------------+------+-----+---------+----------------+ 表 2:明细表 +------------+--------------+------+-----+---------+----------------+ | Field
  • @OneToMany没有逆关系并且没有联接表?(@OneToMany without inverse relationship and without a join table?)
    问题 这与“没有单独的联接表的休眠@OneToMany”类似,因为我需要一个没有联接表的@OneToMany关系。 但是,我也不想定义逆关系。 删除相反的内容似乎会导致自动生成联接表...是否有解决方法? 回答1 在JPA 2.0+中,您可以使用@JoinColumn作为避免生成联接表的方法。 尝试一下。 @OneToMany @JoinColumn(name="COLUMN_NAME") 更新 上面提供的信息摘自EJB 3.0 o'illy书(查找@JoinColumn批注引用了PHONE表中的CUSTOMER_ID列)。 但是,普通的JPA 1.0规范不支持此功能。 它说的是 可以使用一对多外键映射来实现单向一对多关系,但是,在此版本中不需要这种支持。 希望对一对多关系使用外键映射策略的应用程序应使这些关系成为双向关系,以确保可移植性 因此,在1.0中,它是特定于供应商的实现(这很有意义,作者在JBoss工作-休眠背后的红帽分歧) 但是它受到JPA 2.0实现的支持 如果联接用于使用外键映射策略的单向OneToMany映射,则外键在目标实体的表中。 回答2 在JPA 1.0规范不支持单向一对多映射没有加入表。 并且在标准JPA 1.0中不允许在OneToMany上使用JoinColumn (仅在OneToOne , ManyToOne或ManyToMany )。 它是在JPA
  • Hibernate @ManyToMany joinTable-使用联接表的字段进行订购(Hibernate @ManyToMany joinTable - OrderBy using join table's field)
    问题 有3个表: TABLE_A ID_A 栏位1 场N TABLE_B ID_B 栏位1 场N TABLE_A_B ID_A ID_B orderField public class A(){ @ManyToMany @JoinTable(name="TABLE_A_B", joinColumns={@JoinColumn(name="ID_A")}, inverseJoinColumns={@JoinColumn(name="ID_B")}) @OrderBy(value="orderField") private List<TABLE_B> BList; } 但它不起作用,而是出现运行时错误: Caused by: org.postgresql.util.PSQLException: ERROR: column B1_.orderField doesn't exist Position: 1437 Hibernate在TABLE_B中搜索该字段。 是否可以使用联接表的字段在多对多关系中使用“ OrderBy”? 还是以其他方式在同一领域下订单? 回答1 您的代码是正确的,如果您尝试过,它将起作用。 一个问题是您正在使用list因此在缓存中保存该列表时可能不会进行排序,但是如果您清除当前会话并再次获取它,则将按照使用@OrderBy(value="orderField"
  • 休眠注释放在哪里?(Where to put hibernate annotations?)
    问题 我将休眠注释放在哪里? 它是我的实例变量上方的线吗? 还是在吸气剂之前? 还是在二传手之前? 还是真的不重要吗? 非常感谢 回答1 您可以将它们放在野外或吸气剂上。 从《 Hibernate注释参考指南》中: 2.2.1。 将POJO标记为持久实体 (...) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。 EJB3规范要求您在将要访问的元素类型上声明注释,即,如果使用属性访问,则为getter方法;如果使用字段访问,则为字段。 应避免在字段和方法中混合使用注释。 Hibernate将从@Id或@EmbeddedId的位置猜测访问类型。 您可能还想阅读有关@Access批注,该批注允许强制/覆盖访问类型(在Hibernate Annotations 3.5和JPA 2.0之前,它是Hibernate Annotation Extensions的一部分): 2.2.2.2。 访问类型默认情况下,类层次结构的访问类型由@Id或@EmbeddedId批注的位置定义。 如果这些注释在字段上,则仅考虑字段的持久性,并通过字段访问状态。 如果在getter上有注释,则仅考虑getter的持久性,并通过getter / setter访问状态。 这在实践中效果很好,是推荐的方法。 笔记在类层次结构中,注释的位置必须一致(字段或属性),以便能够确定默认访问类型。
  • 无需主键或联接表即可休眠多对一关系(Hibernate Many-To-One Relationship without Primary Key or Join Table)
    问题 问题 首先,我想知道我的数据库结构非常糟糕,但是目前我无法更改它。 话虽这么说,我需要在Hibernate(4.2.1)中创建一对多的双向关系,该关系不涉及主键(关系的“父”侧仅包含唯一键)并且不涉及联接表。 表示这种关系的外键是从“子”到“父”的反向指针(请参见下文)。 我已经搜索并尝试了各种不同的注释配置,但都没有碰到运气。 我要的是可能的吗? 数据库 GLOBAL_PART CREATE TABLE "GLOBAL_PART" ( "GLOBAL_PART_ID" NUMBER NOT NULL, "RELEASES" NUMBER, CONSTRAINT "GLOBAL_PART_PK" PRIMARY KEY ("GLOBAL_PART_ID"), CONSTRAINT "GLOBAL_PART_RELEASES_UK" UNIQUE ("RELEASES") ); PART_RELEASE CREATE TABLE "PART_RELEASE" ( "PART_RELEASE_ID" NUMBER NOT NULL, "COLLECTION_ID" NUMBER, CONSTRAINT "PART_RELEASE_PK" PRIMARY KEY ("PART_RELEASE_ID"), CONSTRAINT "GLOBAL_PART_RELEASE_FK"
  • 使用@ManyToMany 注释从连接表中级联删除(Cascade deleting from join table with @ManyToMany annotation)
    问题 嗨,我在映射实体时遇到问题。 我正在使用 JPA2 和 Hibernate 实现。 我得到了带有@ManyToMany 注释的表格 http://img204.imageshack.us/img204/7558/przykladd.png 我用它映射了它: @Entity @Table("employee") class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column private String name; @ManyToMany @JoinTable(name = "proj_emp", joinColumns = @JoinColumn(name = "employee_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "project_id", referencedColumnName = "id"), uniqueConstraints = @UniqueConstraint(columnNames = {"employee_id", "project_id"})) private List<Project> projects
  • org.hibernate.AnnotationException:referencedColumnNames 引用未映射到单个属性(org.hibernate.AnnotationException: referencedColumnNames referencing not mapped to a single property)
    问题 我在 2 个实体之间映射一对一时遇到了以下异常。 第一个实体已嵌入复合键。 第二个实体也有嵌入的复合键。 这些表是遗留系统的一部分。 数据是扁平的,关系没有明确定义。 请帮忙。 Caused by: org.hibernate.AnnotationException: referencedColumnNames(FLAG_NAME) of net.javabeat.spring.model.ReferralsM.mnEditFlag referencing net.javabeat.spring.model.MnEditFlag not mapped to a single property at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:205) at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:116) at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1515) at org.hibernate.cfg.Configuration
  • 休眠:自我加入混乱?(Hibernate : self join confusion?)
    问题 我有一个category表,其中前5个是主要类别,其他是子类别。 我需要获取前5个主要类别的子类别,所以我找到了sql查询 SELECT m.category_id,m.category_name AS 'Parent', e.category_name AS 'Sub' FROM category e INNER JOIN category m ON m.category_id = e.parent_category_id ORDER BY Parent 查询本身连接到同一张表,并得到下面给出的结果 结果 如何将SQL查询转换为HQL,并以标准json格式将上述图像之类的数据返回给用户? FetchSubCategory import java.io.Serializable; import java.util.Set; import javax.persistence.*; @Entity @Table(name = "category") public class FetchSubCategory implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column
  • org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包(org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags)
    问题 以下是我的代码在这里,我使用多个列表从数据库中获取数据。 从hql查询中获取数据时,它显示异常。 Pojo课 public class BillDetails implements java.io.Serializable { private Long billNo; // other fields @LazyCollection(LazyCollectionOption.FALSE) private List<BillPaidDetails> billPaidDetailses = new ArrayList<BillPaidDetails>(); private Set productReplacements = new HashSet(0); @LazyCollection(LazyCollectionOption.FALSE) private List<BillProduct> billProductList = new ArrayList<BillProduct>(); //getter and setter } hmb.xml文件 <class name="iland.hbm.BillDetails" table="bill_details" catalog="retail_shop"> <id name="billNo" type="java.lang.Long
  • Hibernate HQL连接获取不是递归获取(Hibernate HQL join fetch not recursively fetching)
    问题 我有以下查询和方法 private static final String FIND = "SELECT DISTINCT domain FROM Domain domain LEFT OUTER JOIN FETCH domain.operators LEFT OUTER JOIN FETCH domain.networkCodes WHERE domain.domainId = :domainId"; @Override public Domain find(Long domainId) { Query query = getCurrentSession().createQuery(FIND); query.setLong("domainId", domainId); return (Domain) query.uniqueResult(); } Domain为 @Entity @Table public class Domain { @Id @GenericGenerator(name = "generator", strategy = "increment") @GeneratedValue(generator = "generator") @Column(name = "domain_id") private Long domainId; @Column
  • JPA详解
    JPA 的简介 Java Persistence API(Java 持久层 API):用于对象持久化的 API作用:使得应用程序以统一的方式访问持久层 JPA 与 Hibernate的什么关系: ​ 1)JPA 是 一个标准的接口 ​ 2 Hibernate 是 JPA 的一个实现 : Hibernate是如何实现与JPA的关系的? ​ 通过hibernate-annotation、hibernate-entitymanager和hibernate-core三个组件来实现 JPA 包括三个方面的技术: ORM JavaBean和数据库中的数据表建立映射关系,支持 XML 和 注解(jdk5.0) 两种形式JPA 的 API查询语言:JPQL,jpql其原型就是hibernate的hql 一般在实际开发中,优先考虑使用JPA注解,这样更有利于程序的移植和扩展 JPA版本: JPA.0 - 此版本于2009年下半年发布。以下是此版本的重要功能: 它支持验证。它扩展了对象关系映射的功能。它共享缓存支持的对象。它共享缓存支持的对象。 JPA 2.1 - JPA 2.1于2013年发布,具有以下特性: - 它允许提取对象。它为条件更新/删除提供支持。它生成模式。 JPA 2.2 - JPA 2.2在2017年作为维护开发而发布。它的一些重要特性是: 它支持Java 8的日期和时间。它提供了