Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA,不要insertable=false,Updateable=false,变通方法?_Java_Jpa_Foreign Keys_Entity_Hibernate Onetomany - Fatal编程技术网

Java JPA,不要insertable=false,Updateable=false,变通方法?

Java JPA,不要insertable=false,Updateable=false,变通方法?,java,jpa,foreign-keys,entity,hibernate-onetomany,Java,Jpa,Foreign Keys,Entity,Hibernate Onetomany,我对stackoverflow和JPA都是新手,所以我会尽我所能解释这一点 在一个实体中,我想通过给出int值来设置外键,但我也想通过给出一个对象来设置外键。这里有一些代码可以更好地解释它 @Entity public class Thread implements Serializable { @ManyToOne @JoinColumn(name = "accountId", referencedColumnName = "id", nullable = false)

我对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交给相关代码时,可能会出现这种情况。然后应该重构这些代码以移交实体


在您的特定情况下,您还可以同时使用account作为实体和外键作为属性,两者都是可插入和可更新的。您只需确保accountId属性值与指向account实体表示的行的外键一致。JPA提供者应该能够处理这个问题(例如,我知道OpenJPA是这样做的)。不过,您在这方面有点受限。例如,您只能读取accountId属性值,因为将其设置为其他值会导致account实体值之间不一致。

请参阅,我只会使用对象,而忘记使用ID。如果您试图对应用程序进行超级优化,请使用会话缓存,然后尝试
em.getReference()
以防止数据库被点击。感谢您的回复!在我进一步研究并记住您的答案后,我意识到我可以使用getReference()来获取代理。不幸的是,我偶然发现了懒惰加载的新问题,而这似乎并不像我所理解的那样有效。我已经发布了两个不同的问题,我试图用两种不同的方式来解决这个问题。这里是链接,如果你想看看他们以及。