Java 类之间的JPA关系,指的是它们的接口
我有两个类及其各自的接口,我想在它们之间创建一个JPA@OneToOne关系。如果[class EmployeeImpl]在关系属性[field Address]中使用非实体[class Address]作为目标实体,则此操作失败 第一接口/类: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
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允许接口符号,但仍然需要实体类。在你输入评论时,我对我的答案进行了轻微的编辑。两个答案都正确,这一个对我来说更有帮助。接受这一点,并希望它也能帮助其他人。