Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用复合部分生成的键持久化实体_Java_Hibernate_Jpa_Orm_Persistence - Fatal编程技术网

Java 如何使用复合部分生成的键持久化实体

Java 如何使用复合部分生成的键持久化实体,java,hibernate,jpa,orm,persistence,Java,Hibernate,Jpa,Orm,Persistence,我有一个实体,例如A,它包含3个字段作为复合键,其中id是序列生成的: @Entity @IdClass(APK.class) public class A extends AbstractEntity { @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "_A_SEQ") @SequenceGenerator(name = "A_SEQ", sequenceName= "A_SEQ", allocationSiz

我有一个实体,例如A,它包含3个字段作为复合键,其中id是序列生成的:

@Entity
@IdClass(APK.class)
public class A extends AbstractEntity {

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "_A_SEQ")
@SequenceGenerator(name = "A_SEQ", sequenceName= "A_SEQ", allocationSize = 1)
private Integer a1;

@Id
private Integer a2;

@Id
private String a3;

....

@ManyToOne
@JoinColumns({
        @JoinColumn(name = "a1", referencedColumnName = "b1", insertable = false, updatable = false),
        @JoinColumn(name = "a2", referencedColumnName = "b2", insertable = false, updatable = false)
})
private B b;
因此,由于a1、a1、a3是复合键的组成部分,因此我可以有,例如: 1222,1,s, 1222,1,m-初选,因为它们是唯一的。但是我无法实现这种情况,因为当我持久化一个新实体时,a1已经生成,但这次我不需要它。如何避免这种情况

然后如何更好地将A和B连接起来,如果A有三部分,主要是a1、a2、a3,B只连接到b1到a1和b2到a2,例如: 在a1、a2、a3中:

1222,1,S, 1222,1,M, 1222,1,K 在b1、b2中: 1222,1


谢谢大家!

不要使用JPA排序。排序用于使a1唯一,这显然是您不希望的,因为您希望在a2和a3的不同组合中重用a1值。因此,删除它,并将自己的值指定给a1。或者使用JPA测序,不用麻烦使用复合pK。如果你有一个唯一的a1字段用作pk,那么就不需要另外两个字段——这使一切变得更加简单和高效。是的,我唯一关心的是db使用这个序列……我不确定我是否理解你的数据模型,而你正在其上构建一个不同的对象模型。如果您有一个现有的DB,并且它正在使用序列,那么我不知道如何更改您的对象模型以开始使用复合PK和复合外键。你通常必须使用已经存在的东西。如果DB使用a1作为唯一键,我不明白为什么应用程序会开始使用a1、a2、a3作为唯一键,而a1可以。