Hibernate @ElementCollection的序列生成器和代理项ID列

Hibernate @ElementCollection的序列生成器和代理项ID列,hibernate,jpa,Hibernate,Jpa,我想简化当前的实体模型,用于存储用户的旧密码*以防止重用 为了简单起见,我省略了大多数注释属性 @Entity @Table public class User { @Id @Column private String id; .... @OneToMany @OrderBy("id desc") private List<OldPassword> oldPasswords; } @Entity @Table @Seq

我想简化当前的实体模型,用于存储用户的旧密码*以防止重用

为了简单起见,我省略了大多数注释属性

@Entity
@Table
public class User {
    @Id
    @Column
    private String id;


    ....

    @OneToMany
    @OrderBy("id desc")
    private List<OldPassword> oldPasswords;

}

@Entity
@Table
@SequenceGenerator
public class OldPassword {

    @Id
    @GeneratedValue
    @Column
    private Long id;

    @ManyToOne
    private User user;

    @Column
    private String oldPassword;
}
但是当我创建模式时,我在Oracle中得到了
hibernate\u序列
,主键由
USER\u ID
OLD\u PASSWORD\u ID
生成

我必须(针对向后兼容性问题)获得
旧密码\u ID
作为唯一主键正确的Oracle序列

在JPA中,我如何定义一个
@ElementCollection
,它有自己的代理、自动递增的主键,也用于对
列表进行总排序?回想一下,如果集合上没有
@OrderBy
@OrderColumn
注释,就不能使用
列表,否则Hibernate不知道如何对元素排序。在没有顺序列的情况下,必须使用无序的
集合


*在有人评论之前的安全注意事项是:我存储加密的密码

ElementCollection没有自己的代理项id。它使用所属对象的id。O-OAn ElementCollection的所有部分都没有自己的代理项id。它使用拥有对象的id。O-O的所有部分
@JsonIgnore
@ElementCollection(fetch = FetchType.LAZY,
        targetClass = String.class)
@SequenceGenerator(name = "SEQ_STORE",
        sequenceName = "SEQ_OLD_PASSWORDS")
@GeneratedValue(strategy = GenerationType.AUTO,
        generator = "SEQ_STORE")
@CollectionTable(name = "XTB_OLD_PASSWORDS",
        joinColumns = @JoinColumn(name = "USER_ID",
                nullable = false) ,
        foreignKey = @ForeignKey(name = "FK_XTB_OLDPWD_2_USR") )
@Column(name = "PASSWORD",
        nullable = false,
        length = 100)
@OrderBy("OLD_PASSWORD_ID desc")
@OrderColumn(name = "OLD_PASSWORD_ID",
        nullable = false)
private final List<String> oldPasswords = new ArrayList<>();