我想简化当前的实体模型,以存储用户的旧密码*以防止重用。
为简单起见,我省略了大多数注释属性。
@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_ID
,OLD_PASSWORD
)列的表格,因为我会错过订购。我需要OLD_PASSWORDS
表来显示以下列:ID
(自动增量),USER_ID
,OLD_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_ID
和OLD_PASSWORD_ID
生成。
我必须(针对向后兼容性问题)获取OLD_PASSWORD_ID
仅作为主键和正确的Oracle序列。
在JPA中,如何定义@ElementCollection
具有自己的代理,自动递增的主键,也用于List
的总排序?回忆一下,如果集合中没有List
或@OrderBy
注释,就不能使用@OrderColumn
,否则Hibernate不知道如何订购元素。如果没有订单列,则必须使用无序的Set
。
*安全提示之前有人评论:我存储密码加密!!!