我是 stackoverflow 和 JPA 的新手,所以我会尽我所能解释这一点。
在一个实体中,我想通过提供 int 值来设置外键,但我也想通过提供一个对象来设置它。这里有一些代码可以更好地解释它。
@Entity
public class Thread implements Serializable {
@ManyToOne
@JoinColumn(name = "accountId", referencedColumnName = "id", nullable = false)
public Account getAccount() {
return account;
}
@Column(name = "accountId")
@Basic
public int getAccountId() {
return accountId;
}
}
我已经尝试了几种方法,但上面的代码是我想要实现的目标的最佳示例。我知道在这两种方法中的任何一种中设置 insert = false 和 update = false 都会使这段代码在编译和运行时起作用。但我希望能够通过使用 Account 对象并设置实际的 int accountId 来插入 accountId。
这是因为有时在我的服务器中,我只有 accountId 而有时我有 Account 对象。
我还了解到,最好的解决方案可能是在创建线程和设置 accountId 时使用 account.getId()。但是在我的服务器中能够只使用该对象在逻辑上很好。
提前致谢!
最佳答案
我认为您在应用程序中遇到了概念性问题。在使用 JPA 时,您应该坚持设置实体并且不要使用任何外键值。问题的原因是您的应用程序在某些时候只提供了 accountId。
这可能是由于不同的原因造成的。如果这是因为仅提供 accountId 的应用程序部分是遗留的,那么我认为拥有一个将 accountId 转换为 Account 实体然后设置该实体的适配器是非常好的。也不是说适配器可以创建 JPA 代理,以便此时不需要实际的数据库访问。我能想到的另一个原因是应用程序在处理过程中的某个时刻丢失了信息。当应用程序在某个地方使用帐户并且只将其 Id 移交给相关代码时,可能会出现这种情况。然后应该重构这样的代码以移交实体。
在您的特定情况下,您还可以同时使用帐户作为实体和外键作为可插入和可更新的属性。您只需确保 accountId 属性值与指向由帐户实体表示的行的外键一致。 JPA 提供者应该能够处理这个问题(例如我知道 OpenJPA 可以处理)。但是你对此有点限制。例如,您只能读取 accountId 属性值,因为将其设置为不同的值会导致帐户实体值之间不一致。
关于java - JPA,不想要 insertable=false,updatable=false,解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16059366/