休眠:映射指向唯一键的外键 - java

我有一个包含由两列组成的复合主键的表,并且该表也有一个唯一键。另一个表中的唯一键被映射为外键。如何使用Hibernate实现此映射?我为复合主键创建一个@Embedable类,并在实体中将其与注释@EmbeddedId一起使用。在第二个表中,我声明一个字段:

 @ManyToOne
 @JoinColumn(name = "user_code", nullable = false)
 public User userCode;

这是第一个表中的唯一键,但是我遇到了一个例外:从com.users.maintenance.Code引用com.users.maintenance.User的外键具有错误的列数。应该是2。

编辑
这是我的User类:

 @Entity
 @Table(name = "Users")
 public class User {

      @EmbeddedId
      public UserPk userId;

      @column(name = "code")
      public int code;

      public UserPk getUserId() {
          return this.userId;
      }

      public void setUserId(UserPk userId) {
           this.userId = userId;
      }

      public String getEmail() {
          return this.email;
      }

      public void setEmail(String email) {
           this.email = email;
      }

      @Embeddable
      private class UserPk implements Seriazible {

            @Column(name = "user_name")
            public String userName;

            @Column(name = "email")
            public String email; 

            public String getUserName() {
                return this.userName;
            }

            public void setUserName(String userName) {
                this.userName = userName;
            }

            public String getEmail() {
                return this.email;
            }

            public void setEmail(String email) {
                this.email = email;
            } 

            @Override
            public int hashCode() {
                return this.hashCode();
            }

            @Override
            public boolean equals(Object obj) {
                if (obj == this) {
        return true;
        }

        if (!(obj instanceof UserPk)) {
        return false;
        }

        UserPk pk = (UserPk)obj;

        return pk.userName == userName && pk.email == email;
           }
      }
 }

参考方案

您需要告诉Hibernate您指的是什么User列(如果它不是主键)。为此,在第二个实体中添加referencedColumnName

 @ManyToOne
 @JoinColumn(name = "user_code", nullable = false, referencedColumnName = "code")
 public User userCode;

我没有检查过,但是也许您还必须指定code列在User类中是唯一的:

public class User {
...

      @Column(name = "code", unique=true)
      public int code;
...

只需注意一点:不要公开所有字段,请正确使用封装。

无法使用具有简单的oneToMany-ManyToOne关系的JPA(休眠)持久化新对象图 - java

我正在尝试通过jpa持久化/合并一个全新的对象图,但是持久化的顺序似乎不正确,因为它试图保存对其父级存在约束的子对象。public class ObjectA implements Serializable { ... @OneToMany(cascade = CascadeType.ALL, mappedBy = "objectAId"…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…