我有两个类及其各自的接口,我想在其中创建JPA @OneToOne
关系。这与[class EmployeeImpl] uses a non-entity [class Adress] as target entity in the relationship attribute [field adress]
失败。
第一个接口/类:
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(在其中移交持久性单元)时发生异常。我正在使用eclipse link 2.0.2。
答案 0 :(得分:2)
JPA标准不允许接口字段(或接口字段集合)作为实体关系。一些JPA实现支持它(例如DataNucleus JPA),但它是规范的供应商扩展。因此,您可以使用其中一个实现或更改模型(或添加额外的注释/ XML来定义实际存储的类型)。
答案 1 :(得分:2)
实际上JPA确实允许这样的接口关系,但是在这种情况下你必须提供一个实现接口的实体类,在这种情况下,它将如下所示:
@OneToOne(targetEntity = AddressImpl.class)
private Adress adress;