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关系,指的是它们的接口_Java_Jpa - Fatal编程技术网

Java 类之间的JPA关系,指的是它们的接口

Java 类之间的JPA关系,指的是它们的接口,java,jpa,Java,Jpa,我有两个类及其各自的接口,我想在它们之间创建一个JPA@OneToOne关系。如果[class EmployeeImpl]在关系属性[field Address]中使用非实体[class Address]作为目标实体,则此操作失败 第一接口/类: public interface Employee { public long getId(); public Adress getAdress(); public void setAdress(Adress adress); } @En

我有两个类及其各自的接口,我想在它们之间创建一个JPA@OneToOne关系。如果[class EmployeeImpl]在关系属性[field Address]中使用非实体[class Address]作为目标实体,则此操作失败

第一接口/类:

public interface Employee {
  public long getId();
  public Adress getAdress();
  public void setAdress(Adress adress);
}

@Entity(name = "EmployeeImpl")
@Table(name = "EmployeeImpl")
public class EmployeeImpl implements Employee {

  @Id
  @Column(name = "employeeId")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @OneToOne(cascade = CascadeType.PERSIST)
  private Adress adress;

  // snip, getters and setters
}
public interface Adress {
  public long getId();
  public String getStreet();
  public void setStreet(String street);
}

@Entity(name = "AdressImpl")
@Table(name = "AdressImpl")
public class AdressImpl implements Adress {

  @Id
  @Column(name = "AdressId")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @Column(name = "Street")
  private String street;

  // Snip getters and setters
}
第二接口/类:

public interface Employee {
  public long getId();
  public Adress getAdress();
  public void setAdress(Adress adress);
}

@Entity(name = "EmployeeImpl")
@Table(name = "EmployeeImpl")
public class EmployeeImpl implements Employee {

  @Id
  @Column(name = "employeeId")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @OneToOne(cascade = CascadeType.PERSIST)
  private Adress adress;

  // snip, getters and setters
}
public interface Adress {
  public long getId();
  public String getStreet();
  public void setStreet(String street);
}

@Entity(name = "AdressImpl")
@Table(name = "AdressImpl")
public class AdressImpl implements Adress {

  @Id
  @Column(name = "AdressId")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @Column(name = "Street")
  private String street;

  // Snip getters and setters
}
persistence.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
  xmlns="http://java.sun.com/xml/ns/persistence" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="employee"
        transaction-type="RESOURCE_LOCAL">
        <class>EmployeeImpl</class>
        <class>AdressImpl</class>
        <properties>
            <property name="eclipselink.create-ddl-jdbc-file-name"
    value="create-matterhorn-employee.jdbc" />
            <property name="eclipselink.drop-ddl-jdbc-file-name" 
    value="drop-matterhorn-employee.jdbc" />
        </properties>
    </persistence-unit>

</persistence>

我缩短了包名和导入等。尝试创建EntityManagerFactory并在其中移交持久性单元时发生异常。我使用的是EclipseLink2.0.2。

JPA标准不允许接口字段或接口字段集合成为实体关系。一些JPA实现确实支持它,例如DataNucleus JPA,但它是规范的供应商扩展。因此,您可以使用这些实现之一,或者更改模型,或者添加额外的注释/XML来定义实际存储在其中的类型。

JPA标准不允许接口字段或接口字段集合作为实体关系。一些JPA实现确实支持它,例如DataNucleus JPA,但它是规范的供应商扩展。因此,您要么使用这些实现之一,要么更改模型,要么添加额外的注释/XML来定义实际存储在其中的类型。

实际上JPA允许这种接口关系,但是在这种情况下,您必须提供一个实现接口的实体类,在这种情况下,它将如下所示:

@OneToOne(targetEntity = AddressImpl.class)
private Adress adress;

实际上JPA允许这种接口关系,但在这种情况下,您必须提供一个实现接口的实体类,在您的情况下,这将如下所示:

@OneToOne(targetEntity = AddressImpl.class)
private Adress adress;

这很正常,你不能这么做。EmployeeImpl应包含对地址的引用定义时,应在另一个实体中提供完整性引用。在您的例子中,它是AddressImpl,而不是接口AddressProblem,接口和类位于两个不同的OSGi捆绑包中。接口员工无法看到ADRESIMPL。那么我们该怎么做呢?我相信@OneToOnetargetEntity=AddressImpl.class将完成这个任务@Osw的答案是正确的。请把它作为答案贴出来。这很正常,你不能这样做。EmployeeImpl应包含对地址的引用定义时,应在另一个实体中提供完整性引用。在您的例子中,它是AddressImpl,而不是接口AddressProblem,接口和类位于两个不同的OSGi捆绑包中。接口员工无法看到ADRESIMPL。那么我们该怎么做呢?我相信@OneToOnetargetEntity=AddressImpl.class将完成这个任务@Osw的答案是正确的。我认为另一个答案的观点是,当JPA规范列出了JPA接受的字段类型时,它不符合JPA规范的要求,没有对它的引用,也没有关系注释。您在这里所做的只是将字段限制为特定的实现,这与允许接口关系不同。。。正如某些实现所支持的那样,一个接口可以有多个实现。有一个difference@Neil,从形式上说您是对的,JPA允许接口符号,但仍然需要实体类。在你输入评论时,我对我的答案进行了轻微的编辑。两个答案都正确,这一个对我来说更有帮助。我认为另一个答案的要点是,当JPA规范列出JPA接受的字段类型时,它并不适合JPA规范,没有引用它,也没有关系注释。您在这里所做的只是将字段限制为特定的实现,这与允许接口关系不同。。。正如某些实现所支持的那样,一个接口可以有多个实现。有一个difference@Neil,从形式上说您是对的,JPA允许接口符号,但仍然需要实体类。在你输入评论时,我对我的答案进行了轻微的编辑。两个答案都正确,这一个对我来说更有帮助。接受这一点,并希望它也能帮助其他人。