我不知道何时开始,但是我只是按照我一直想要的方式创建了复合键:不需要@EmbeddedId@IdClass !!

  • Spring 4.0.0.M3
  • hibernate 4.3.0.Beta4
  • JPA 2.1

  • User.java :
    @Entity
    public class User {
        @Id
        ...
    
        @OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)
        private List<GroupUser> groupUsers;
    }
    

    Group.java :
    @Entity
    public class Group {
        @Id
        ...
    
        @OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)
        private List<GroupUser> groupUsers;
    }
    

    GroupUser.java :
    @Entity
    public class GroupUser implements Serializable {
        @Id
        @ManyToOne
        @JoinColumn(name="Group_id")
        private Group group;
    
        @Id
        @ManyToOne
        @JoinColumn(name="User_id")
        private User user;
    
        @Id
        @Column
        private String s;
    
        @Column
        private int i;
    }
    

    这就是MySQL所说的:
     USER             GROUP_USER            GROUP
    ------    -------------------------    -------
     id        User_id  (PK, NOT NULL)       id
               Group_id (PK, NOT NULL)
               s        (PK, NOT NULL)
               i        (DEFAULT NULL)
    
    GROUP_USER详细信息:
  • 主键:User_id,Group_id,s
  • 索引#1/外键:User_id
  • 索引2/外键:Group_id


  • 我还做了其他一些测试,例如:
    @Entity
    public class A implements Serializable {
    
        @Id
        @Column
        String a;
    
        @Id
        @Column
        String b;
    
        @Column
        String c;
    
    }
    

    奇迹般有效!!

    仍然有任何理由使用@EmbeddedId@IdClass吗?

    并且:这是JPA 2.1的一部分还是Hibernate功能?

    最佳答案

    JPA要求为复合主键定义某种主键类。但是实际上,这似乎是大多数需要pk类实例的EntityManager find和getReference调用所必需的。实现可能具有自己的pk表示形式,您可以将其用于这些调用,但不能移植。

    08-04 13:23