我是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对象。
我也理解最好的解决方案可能是在创建Thread并设置accountId时使用account.getId()。但是在我的服务器中能够只使用该对象在逻辑上是很好的。
提前致谢!
答案 0 :(得分:3)
我认为您在应用程序中遇到了概念性问题。您应该坚持设置实体,并且在使用JPA时不要使用任何外键值。问题的原因是您的应用程序仅在某个时刻提供accountId。
这可能是由于不同的原因。如果这是因为仅提供accountId的应用程序部分是遗留的,那么我认为拥有一个将accountId转换为Account实体然后设置该实体的适配器是完全没问题的。此外,适配器无法创建JPA代理,因此此时不需要实际的数据库访问。我能想到的另一个原因是应用程序在处理过程中的某些时候丢失了信息。当应用程序在某个地方使用帐户时,可能就是这种情况,并且仅将其移交给相关代码。然后应重构此类代码以移交实体。
在您的特定情况下,您还可以同时使用account作为实体和外键作为属性,同时可以插入和更新。您只需确保accountId属性值与指向帐户实体所代表的行的外键一致。 JPA提供者应该能够处理这个问题(例如我知道OpenJPA)。但是你有点受限制。例如,您只能读取accountId属性值,因为将其设置为不同的值会导致帐户实体值之间的不一致。