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