Mysql JPA使复合外键的一部分成为主键的一部分

Mysql JPA使复合外键的一部分成为主键的一部分,mysql,hibernate,jpa,Mysql,Hibernate,Jpa,我查看了所有可能的Google搜索和Stackoverflow搜索,但找不到我要找的内容。我的问题是有一个类a和一个类B,类a有一个复合主键,类B有一个基本主键。这些类(表)与一个名为C的类连接,我需要它,因为还有其他数据与连接(底部的示例)。在C类中,我显然将B类和A类的主键作为外键,但我需要B类的复合键和A类的外键的第一个属性作为C类中的主键 仅凭文字是很难理解的,因此以下是示例: public class CompositeId implements Serializable {

我查看了所有可能的Google搜索和Stackoverflow搜索,但找不到我要找的内容。我的问题是有一个类a和一个类B,类a有一个复合主键,类B有一个基本主键。这些类(表)与一个名为C的类连接,我需要它,因为还有其他数据与连接(底部的示例)。在C类中,我显然将B类和A类的主键作为外键,但我需要B类的复合键和A类的外键的第一个属性作为C类中的主键

仅凭文字是很难理解的,因此以下是示例:

public class CompositeId implements Serializable {
    private Long id;

    private Long version;

    // Other stuff...
}

@Entity
@IdClass(CompositeId.class)
public class A {
    @Id
    private Long id;

    @Id
    private Long version;

    private String name;

    private String creatorName;

    // Other stuff...
}

@Entity
public class B {
    private Long id;

    private String name;

    // Othet stuff...
}

public class CompositeJoinId implements Serializable {
    private Long aId; // Should equal to aReference's id property.

    private Long bId; // Should equal to bReference's id property.

    // Other stuff...
}

@IdClass(CompositeJoinId.class)
@Entity
public class C {
    @Id
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="a_id", referencedColumnName="id"),
        @JoinColumn(name="a_version", referencedColumnName="version")
    })
    private A aReference;

    @Id
    @ManyToOne
    @JoinColumn(name = "b_id")
    private B bReference;

    private Long day;

    // Other stuff...
}

有没有办法做到这一点?我所有的发现都只使用了一个类,其中使用了两个外部组合键,但我只需要/想要一个;但是我会像这样映射您的类(主要区别是
CompositeJoinId
):


这些是衍生恒等式的例子;第2.4.1节中讨论了派生标识(带有示例)。

这样,我在C类中的主键将是A.id、A.version和B.id,我只需要/想要A.id和B.id。这就是为什么我只在复合join id类中使用id。不幸的是,这对我不起作用。即使你不需要/不想要A.id,你仍然可以告诉JPA把它作为C的id的一部分;因为JPA仍然可以使用它来唯一地标识C实例。除非您使用JPA映射来生成DDL(这是不明智的:-),否则这些映射应该没有问题。当您使用它们时,它们会导致任何问题吗?这就是问题所在,我不想编写自己的数据库脚本,因为这样我就可以使用普通的JDBC。。。所以,是的,我正在从这些模型生成我的数据库,这就是为什么我被卡住了。你还有别的办法吗?如果我自己编写sql脚本并指定C类的主键为A.id和B.id,那么JPA会怎么做?如果您认为JPA只是提供了一种生成数据库的方法,那么您就严重低估了JPA。但你并不孤单-(无论如何:您可以尝试将只读字段映射到相应的列。我将更改我的答案,以反映可能有用的内容。我知道它可以做我甚至不知道的事情,但目前我不需要这些功能。我只需要从模型中正确生成数据库,感谢您的编辑,我将在明天,再次谢谢。
public class CompositeId implements Serializable {
    private Long id;

    private Long version;

    // Other stuff...
}

@Entity
@IdClass(CompositeId.class)
public class A {
    @Id
    private Long id;

    @Id
    private Long version;

    private String name;

    private String creatorName;

    // Other stuff...
}

@Entity
public class B {
    @Id
    private Long id;

    private String name;

    // Othet stuff...
}

public class CompositeJoinId implements Serializable {
    private Long aId;

    private Long bReference; // matches name of @Id attribute and type of B PK

    // Other stuff...
}

@IdClass(CompositeJoinId.class)
@Entity
public class C {
    @Id
    @Column(name = "a_id", insertable = false, updatable = false)
    Long aId;

    @Id
    @ManyToOne
    @JoinColumn(name = "b_id")
    private B bReference;

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="a_id", referencedColumnName="id"),
        @JoinColumn(name="a_version", referencedColumnName="version")
    })
    private A aReference;

    private Long day;

    // Other stuff...
}