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

时间:2016-04-19 15:25:42

标签: hibernate jpa

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

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

@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;
}

我想要实现的目标是删除OldPassword类,并将其实际嵌入到User类中,因为它应该是List<String>类。

此关联存在问题。我必须按相反的时间顺序排序密码。我的意思是我不能简单地拥有一个包含(USER_IDOLD_PASSWORD)列的表格,因为我会错过订购。我需要OLD_PASSWORDS表来显示以下列:ID(自动增量),USER_IDOLD_PASSWORD

我试过以下

@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<>();

但是当我创建架构时,我在Oracle中获得了hibernate_sequence,并且主键由USER_IDOLD_PASSWORD_ID生成。

我必须(针对向后兼容性问题)获取OLD_PASSWORD_ID仅作为主键正确的Oracle序列。

在JPA中,如何定义@ElementCollection具有自己的代理,自动递增的主键,也用于List的总排序?回忆一下,如果集合中没有List@OrderBy注释,就不能使用@OrderColumn,否则Hibernate不知道如何订购元素。如果没有订单列,则必须使用无序的Set

*安全提示之前有人评论:我存储密码加密!!!

0 个答案:

没有答案