我有一个实体的版本控制作为其主键的一部分。版本控制是通过最后修改的时间戳完成的:
@Entity
@Table(name = "USERS")
@IdClass(CompositeKey.class)
public class User {
@Column(nullable = false)
private String name;
@Id
@Column(name = "ID", nullable = false)
private UUID id;
@Id
@Column(name = "LAST_MODIFIED", nullable = false)
private LocalDateTime lastModified;
// Constructors, Getters, Setters, ...
}
/**
* This class is needed for using the composite key.
*/
public class CompositeKey {
private UUID id;
private LocalDateTime lastModified;
}
会UUID
自动转换String
为数据库的 a 并返回模型的。对于LocalDateTime
. 它会自动转换为 aTimestamp
并返回。
我的应用程序的一个关键要求是:数据可能永远不会更新或被删除,因此任何更新都会导致新条目的lastModified
. 上述代码满足了此要求,并且在此之前可以正常工作。
现在出现了有问题的部分:我想要另一个对象在用户上引用。由于版本控制,这将包括该lastModified
字段,因为它是主键的一部分。这会产生一个问题,因为引用可能很快就过时了。
一种方法可能取决于id
. User
但是如果我尝试这个,JPA 告诉我,我喜欢访问一个字段,它不是Entity
:
@Entity
@Table(name = "USER_DETAILS")
public class UserDetail {
@Id
@Column(nullable = false)
private UUID id;
@OneToOne(optional = false)
@JoinColumn(name = "USER_ID", referencedColumnName = "ID")
private UUID userId;
@Column(nullable = false)
private boolean married;
// Constructors, Getter, Setter, ...
}
解决我的困境的正确方法是什么?
编辑
我得到了JimmyB的建议,我也尝试过但也失败了。我在这里添加了失败的代码:
@Entity
@Table(name = "USER_DETAILS")
public class UserDetail {
@Id
@Column(nullable = false)
private UUID id;
@OneToMany
@JoinColumn(name = "USER_ID", referencedColumnName = "ID")
private List<User> users;
@Column(nullable = false)
private boolean married;
public User getUser() {
return users.stream().reduce((a, b) -> {
if (a.getLastModified().isAfter(b.getLastModified())) {
return a;
}
return b;
}).orElseThrow(() -> new IllegalStateException("User detail is detached from a User."));
}
// Constructors, Getter, Setter, ...
}