Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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:@Embeddeble对象如何获得对其所有者的引用?_Java_Hibernate_Jpa - Fatal编程技术网

Java JPA:@Embeddeble对象如何获得对其所有者的引用?

Java JPA:@Embeddeble对象如何获得对其所有者的引用?,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个用户类,它@Embedded了一个类配置文件。如何向概要文件实例的所有者用户类提供引用 @Entity class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Embedded Profile profile; // .. other properties .. } @Embeddabl

我有一个用户类,它@Embedded了一个类配置文件。如何向概要文件实例的所有者用户类提供引用

@Entity
class User implements Serializable  {
   @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;

   @Embedded Profile profile;

   // .. other properties ..
}

@Embeddable
class Profile implements Serializable {

   User user; // how to make this work?

   setURL(String url) {
      if (user.active() ) { // for this kind of usage
         // do something
      }
   }

   // .. other properties ..
}

请参阅官方文件第2.4.3.4节,您可以使用
@org.hibernate.annotations.Parent
为概要文件对象提供指向其所属用户对象的反向指针,并实现用户对象的getter

@Embeddable
class Profile implements Serializable {

   @org.hibernate.annotations.Parent
   User user; // how to make this work?

   setURL(String url) {
      if (user.active() ) { // for this kind of usage
         // do something
      }
   }

   User getUser(){
       return this.user;
   }

   // .. other properties ..
}

假设JPA不是严格的Hibernate,您可以通过将
@Embedded
应用于getter/setter对而不是私有成员本身来实现这一点

@Entity
class User implements Serializable {
   @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;

   @Access(AccessType.PROPERTY)
   @Embedded
   private Profile profile;

   public Profile getProfile() {
      return profile;
   }

   public void setProfile(Profile profile) {
      this.profile = profile;
      this.profile.setUser(this);
   }

   // ...
}

然而,我想问的是,在这种情况下,嵌入实体是否是您想要的,而不是@OneToOne关系或简单地将概要文件类“展平”为用户。@embeddeble的主要原理是代码重用,在这种情况下,这似乎不太可能。

我使用@Embedded的原因不是代码重用,而是为了获得更集中的较小类,而不是一个大而笨重的全能类。您考虑过简单继承吗?换句话说,如果一个“概要文件”真的是关于一个人的信息,并且每个用户“都是”一个人,那么
类用户是否可以扩展这个人(以前的概要文件)?我不是故意装腔作势,但我只发现
@embeddeble
有一个很好的用途,这也是代码重用(因为我不想费心构建管道来将“嵌入式”类映射到数据库类型)。实际上,我更喜欢组合而不是继承。因为用户不仅仅是一个东西,它实际上是由不同的东西组成的,比如安全性、配置文件和设置。我选择这个作为我的解决方案。嵌入字段上带有AccessType.Property的JPA工作得最好。Hibernates annotation@Parent看起来很有前途,但也需要嵌入对象上的getter和setter,因此没有提供比纯JPA解决方案更好的解决方案。对于一些JPA实现来说,这个技巧似乎也值得一试。谢谢。但是我找不到关于这个Hibernate特性的任何文档,您是否有一些文档的链接?另外,说AccessType.FIELD不适用于@Parent注释字段是否正确?因此,它总是需要一个公共的getter和setter?我从官方文档链接中找到这一点:,第2.4.3.4节@但是我不知道为什么它不起作用。profile对象中的user属性始终保持为空@Parent映射将非常好,只要它支持字段访问,而它显然不支持字段访问。@Parent映射只有在我为用户添加公共getter和setter时才起作用。因此,与CP1R8所述的纯JPA解决方案相比,它没有任何好处。不过还是要谢谢你!我发现,即使在我添加
@Parent
时,hibernate也会将其视为需要在ddl生成中添加字段。。。我不知道如果我不使用它来生成ddl是否会有问题。正如@Kdeveloper所说的,您需要getter/setter方法来让它工作。希望通过Hibernate 5 setter可以得到保护。