我已经定义了我的两个实体类User和Permission之间的多对多关系.用户具有username和countyId的主键组合,我的Permission表具有常规整数Id.表UserPermission具有三个外键作为其主键:username,countyId和permissionId.

由于这是一个遗留数据库,我将无法使用Right Thing(™)并在User上创建一个整数主键.

我在User.class中定义了这样的多对多关系:

@ManyToMany(targetEntity=Permission.class,cascade={ CascadeType.PERSIST,CascadeType.MERGE } )

@JoinTable(name="tblUserPermission",joinColumns = { @JoinColumn(name="username"),@JoinColumn(name="countyId") },inverseJoinColumns = { @JoinColumn(name="permissionId") })

private Collection

Permission.class说:

@ManyToMany( cascade = {CascadeType.PERSIST,CascadeType.MERGE},mappedBy = "permissions",targetEntity = User.class )

private Collection

我认为这是要走的路,但是当我启动使用Hibernate 3的Spring上下文时,我得到:

Caused by: org.hibernate.AnnotationException: A Foreign key refering com.mydomain.data.entities.User from com.mydomain.data.entities.Permission has the wrong number of column. should be 1

我在注释中做错了什么?应该是2,而不是1.

更新:

Arthur建议我添加referencedColumnName,但这给了我一个新的异常:

Caused by: org.hibernate.AnnotationException: referencedColumnNames(username,countyId) of com.mydomain.data.entities.Permission.permissions referencing com.mydomain.data.entities.User not mapped to a single property

根据他的要求,请遵循以下代码:

Permission.Class:

package com.mydomain.data.entities;

import java.io.Serializable;

import java.util.Collection;

import javax.persistence.*;

import org.hibernate.annotations.ForeignKey;

@Entity

@Table(name = "tblPermission")

public class Permission extends PublishableEntityImpl implements Serializable,Cloneable {

private static final long serialVersionUID = 7155322069731920447L;

@Id

@Column(name = "PermissionId",length = 8,nullable = false)

private String PermissionId = "";

@ManyToOne(fetch=FetchType.LAZY)

@JoinColumn(name = "CountyId",nullable = false)

@ForeignKey(name="FK_CountyID")

private County county;

@Column(name = "Permission",nullable = true)

private Integer permission = 1;

@ManyToMany( cascade = {CascadeType.PERSIST,mappedBy = "Permissions",targetEntity = Item.class )

private Collection

和User.class

package com.mydomain.data.entities;

import java.util.*;

import java.io.Serializable;

import javax.persistence.*;

import org.hibernate.annotations.ForeignKey;

import org.hibernate.annotations.IndexColumn;

import org.springframework.security.core.GrantedAuthority;

import org.springframework.security.core.authority.GrantedAuthorityImpl;

import org.springframework.security.core.userdetails.UserDetails;

@Entity

@Table(name = "tblUser")

public class User extends PublishableEntityImpl implements Serializable,Cloneable {

@Id

@Column(name = "CountyId",nullable = false)

private Integer countyId;

@Id

@Column(name = "Username",length = 25,nullable = false)

private String username;

@ManyToOne(fetch=FetchType.LAZY)

@JoinColumn(name = "CountyId",nullable = false,insertable=false,updatable=false)

@ForeignKey(name="FK_CountyID")

private County county;

@Column(name = "Name",length = 50,nullable = true)

private String name;

@Column(name = "Password",length = 30,nullable = true)

private String password;

@Column(name = "Role",nullable = false)

private Integer role;

@ManyToMany(targetEntity=Permission.class,CascadeType.MERGE } )

@JoinTable(name="tblUserPermission",joinColumns = { @JoinColumn(name="Username",referencedColumnName="Username"),@JoinColumn(name="CountyId",referencedColumnName="CountyId") },inverseJoinColumns = { @JoinColumn(name="PermissionId",referencedColumnName="PermissionId") })

private Collection

干杯

Java hibernate假外键_java – Hibernate:外键的列数错误相关推荐

  1. Java hibernate假外键_java – Hibernate:没有实体类的外键,只能通过id

    我有一个分层实体,它将自己引用为父母.我只需要通过id进行映射,而不是通过实体实例进行映射(原因太复杂,无法解释).所以我这样定义了实体: class Item { @Id private Strin ...

  2. java nio 堆外内存_Java堆外内存之突破JVM枷锁

    对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM ...

  3. java list 超出范围_java-列索引超出范围:2,列数1

    我有这个表: 学生 CREATE TABLE IF NOT EXISTS Klas_student( Student varchar(7) REFERENCES studenten (Studente ...

  4. java 进程假死原因_Java进程假死案例集合

    1. 案例1 今天通过域名调一个接口,10次中偶尔有1-2次请求失败,域名后绑定VIP,VIP后面为5台应用服务器. 1.1 范围缩小 直觉怀疑为某一台有有问题,于是单独的进行接口调用发现确实为其中一 ...

  5. java9 堆外内存_java堆外内存泄漏排查

    当考虑Java中的内存泄漏时,我们通常会考虑Java堆泄漏,即在堆中分配的对象没有被垃圾收集.这是我在处理一台服务器内存泄漏时的想法,但我即将经历的远超出我的想象. 症状:运行Vertx应用程序(没有 ...

  6. java quartz 重启不了_java – 重新启动quartz调度程序而不会出现错误

    上下文 我正在尝试使用jdbc在集群模式下使用quartz调度程序. 问题 在我开始使用集群模式的jdbc之前,我刚刚通过RAM存储测试了调度程序.这没有问题,我能够重启调度程序(主类),没有任何错误 ...

  7. java 不是封闭类_java – 不是一个封闭的类错误Android Studio

    我在 Android开发中是新的,并没有深入的Java知识.我长时间困扰着一个问题.我试图在按钮点击上打开一个新的活动.但是我收到一个错误:错误:不是封闭类:Katra_home. 这是MainAct ...

  8. java 背景图片被覆盖_Java中涉及背景图片的怪异错误

    我的问题是,当我运行程序时,我得到的是白屏和较早版本的文本,而不是应该显示的背景图像.我已经删除了与该版本关联的所有代码. 我四处寻找帮助,我所看到的所有线程都说要编写代码来进行设置.我什至不知道显示 ...

  9. java怎么定义字符长度_java – 当字符串长度超过列长度定义时,如何以静默方式截断字符串?...

    我有一个Web应用程序,使用EclipseLink和MySQL存储数据. 其中一些数据是字符串,即DB中的varchars. 在实体代码中,字符串具有如下属性: @Column(name = &quo ...

最新文章

  1. Lua生成Guid(uuid)
  2. Linux C 获取本地 ip mac 域名对应 ip
  3. 深度网络pre-train对于深度网络的意义
  4. AbstractBeanFactory 的getBean()方法调用FactoryBean
  5. 数据库-null值处理及元数据
  6. Jenkins Ci系列目录
  7. 打造工业级推荐系统(三):推荐系统的工程实现与架构优化
  8. 形式化验证工具TLA+:程序员视角的入门之道
  9. Spring AOP注解
  10. 推荐两款Docker可视化工具
  11. spark RDD transformation与action函数整理
  12. 苹果手机回收价格怎么查询
  13. 为什么说千万别用微软 IE 下载 Chrome?
  14. TGRS2022/云检测:Unsupervised Domain Adaptation for Cloud Detection Based on Grouped Features Alignment
  15. BUCTOJ邀请赛20180814-D: String
  16. mybatisplus--getOne和逻辑删除问题详解
  17. CTF之crpto练习三
  18. 关于虚拟机及dockers
  19. 吵架公约,我不在担心婚后。
  20. 计算机图形学(二)输出图元_6_OpenGL曲线函数_5_其他曲线

热门文章

  1. P2212 [USACO14MAR]Watering the Fields S(最小生成树)
  2. 小程序【笔记001】框架和配置文件
  3. 在Mac电脑上用VMware Fusion在移动硬盘上安装Windows7虚拟机
  4. python axes_python matplotlib中axes与axis的区别?
  5. vue获取编辑器纯文字_前端富文本编辑器 vue-html5-editor
  6. qbytearray初始化全0_【小白学PyTorch】4.构建模型三要素与权重初始化
  7. k8s容器内的东西复制出来_容器 | Docker 如此之好,你为什么还要用k8s
  8. nginx哪个版本性能好_骁龙750g和天玑1000+哪个好-参数性能对比
  9. 荣耀30会不会升级鸿蒙,荣耀手机不能升级鸿蒙吗?有博主给出升级名单
  10. 双稳态继电器工作原理图_三招带你分清继电器与接触器