Java Hibernate注释:具有共享复合键属性的多对多

Java Hibernate注释:具有共享复合键属性的多对多,java,hibernate,Java,Hibernate,我正在尝试使用Hibernate+JPA注释映射现有的数据库模式 我的一个实体映射如下: @Entity @Table(name = "users") public class User implements Serializable { @Id private int department; @Id private int userId; ... 和另一个实体,集团: @Entity @Table(name = "groups") public

我正在尝试使用Hibernate+JPA注释映射现有的数据库模式

我的一个实体映射如下:

@Entity
@Table(name = "users")
public class User implements Serializable {

    @Id
    private int department;

    @Id
    private int userId;

    ...
和另一个实体,集团:

@Entity
@Table(name = "groups")
public class Group implements Serializable {

    @Id
    private int department;

    @Id
    private int groupId;

    ...
组和用户之间应该有多对多关系,但问题是联接表(“用户组”)只有列“DEPARTMENT、USERID、GROUPID”-即DEPARTMENT列需要在joinColumns和inverseJoinColumns中使用:

    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
        name = "user_groups",
        joinColumns = { @JoinColumn(name = "department"), @JoinColumn(name = "groupid") },
        inverseJoinColumns = {@JoinColumn(name = "department"), @JoinColumn(name = "userid") }
    )
    private List<User> groupUsers = new ArrayList<>();
@ManyToMany(cascade={CascadeType.ALL})
@可接合(
name=“用户组”,
joinColumns={@JoinColumn(name=“department”),@JoinColumn(name=“groupid”)},
inverseJoinColumns={@JoinColumn(name=“department”),@JoinColumn(name=“userid”)}
)
private List groupUsers=new ArrayList();
这会产生一个映射错误-“实体映射中的重复列”


但是,使用XML似乎可以做到这一点,因为这个确切的示例存在于中,但我找不到任何证据表明使用注释可以做到这一点?我尝试使用@JoinFormula而不是@JoinColumn,但无法编译。有可能吗?

好的,我很确定这是不可能的

我发现了一个很有希望的解决办法:

为“用户组”表创建@Embeddeble:

诀窍是@ManyTone允许您使用@JoinColumnsOrFormulas,因此其中一个连接条件可以是一个公式,而我似乎不适用于@ManyToMany(忽略@JoinColumnsOrFormulas注释,因为它希望连接列是@JoinTable注释的一部分)

然后将UserGroupMemberships映射为ElementCollection:

    @ElementCollection
    @CollectionTable(name = "user_group", joinColumns = {
        @JoinColumn(name = "department", referencedColumnName = "department"),
        @JoinColumn(name = "groupid", referencedColumnName = "groupid")
    })
    @OrderColumn(name = "seq", nullable = false)
    private List<UserGroupMemberships> groupUsers = new ArrayList<>();
@ElementCollection
@CollectionTable(name=“user\u group”,joinColumns={
@JoinColumn(name=“department”,referencedColumnName=“department”),
@JoinColumn(name=“groupid”,referencedColumnName=“groupid”)
})
@OrderColumn(name=“seq”,null=false)
private List groupUsers=new ArrayList();

这只适用于单向多对多关系。

好的,我很确定这是不可能的

我发现了一个很有希望的解决办法:

为“用户组”表创建@Embeddeble:

诀窍是@ManyTone允许您使用@JoinColumnsOrFormulas,因此其中一个连接条件可以是一个公式,而我似乎不适用于@ManyToMany(忽略@JoinColumnsOrFormulas注释,因为它希望连接列是@JoinTable注释的一部分)

然后将UserGroupMemberships映射为ElementCollection:

    @ElementCollection
    @CollectionTable(name = "user_group", joinColumns = {
        @JoinColumn(name = "department", referencedColumnName = "department"),
        @JoinColumn(name = "groupid", referencedColumnName = "groupid")
    })
    @OrderColumn(name = "seq", nullable = false)
    private List<UserGroupMemberships> groupUsers = new ArrayList<>();
@ElementCollection
@CollectionTable(name=“user\u group”,joinColumns={
@JoinColumn(name=“department”,referencedColumnName=“department”),
@JoinColumn(name=“groupid”,referencedColumnName=“groupid”)
})
@OrderColumn(name=“seq”,null=false)
private List groupUsers=new ArrayList();
这只适用于单向多对多关系