如果我想要一个严格的列来组成一个ID。
SQL示例:
CONSTRAINT [PK_NAME] PRIMARY KEY ([Column1],[Column2],[Column3])
我如何使用Jpa Entity类做到这一点?通过columndefinition?
只需将id字段设置为:
value = Column1 + Column2 + Column3 // aint working.
答案 0 :(得分:25)
您需要为复合键创建一个类:
public class CompositeKey implements Serializable {
private int column1;
private int column2;
private int column3;
}
然后在您的实体类中使用@IdClass
注释:
@Entity
@IdClass(CompositeKey.class)
public class EntityExample {
@Id
private int column1;
@Id
private int column2;
@Id
private int column3;
...
...
}
我认为这应该有效。希望它有所帮助,欢呼!
是的,还有另一个解决方案,@ jklee提到的解决方案,两者都有效,这是一个偏好问题。
答案 1 :(得分:10)
使用@Embeddable
和@EmbeddedId
。
示例:
@Entity
public class Project {
@EmbeddedId ProjectId id;
:
}
@Embeddable
Class ProjectId {
int departmentId;
long projectId;
}
此处提供更多信息http://www.objectdb.com/java/jpa/entity/id#Embedded_Primary_Key_
答案 2 :(得分:5)
如果类中的所有字段都是主键的一部分,则解决方案将非常简单(扩展解决方案由@ raul-cuth提供):
@Entity
@IdClass(EntityExample.class)
public class EntityExample implements Serializable {
@Id
private int column1;
@Id
private int column2;
@Id
private int column3;
}
答案 3 :(得分:2)
@IdClass
类上使用@Entity
注释,然后在属于复合主键的各个字段上使用@Id
注释。@Embeddable
类,该类可以包含复合主键的各个字段,然后此类的引用可以用作@Embedded
注释@Entity
中的属性}类。
希望这会有所帮助。答案 4 :(得分:0)
请注意,休眠的Entity-Class-to-SQL-DDL-Script生成器将对所有字段进行排序,并且无论其在定义中出现的顺序如何,都将创建表定义和索引/约束定义。按照字段的排序顺序。
尽管表定义中字段的出现顺序可能无关紧要,但是复合索引中字段的顺序肯定会起作用。因此,必须对键字段进行命名,以便在按其名称排序时,它们按您希望索引的顺序排列。