java - JPA,不想要 insertable=false,updatable=false,解决方法?

标签 java jpa foreign-keys entity hibernate-onetomany

我是 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/

相关文章:

java - 如何使用内存数据库编写测试用例?

java - QueryDSL,其中关系可能为空

postgresql - 如何在 JPA 中使用 Postgres 序列?

mysql - 在 MySQL 中选择外部列

java - 如何在 Java 中比较和排序两个数组列表

java - 如何使用 Spring MongoTemplate 将 Java 8 Instant 作为 Date 类型保存到 MongoDB?

javafx 通过代码点击按钮

java - 尝试在jpa中删除时的并发问题

database - 数据库中两个表之间更灵活的关系?

mysql - 如何更新实际上在其父级中具有唯一 id 重复项的外键字段?