Java 如何使用复合部分生成的键持久化实体
我有一个实体,例如A,它包含3个字段作为复合键,其中id是序列生成的: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
@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可以。