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

时间:2013-11-15 09:25:15

标签: java jpa

我有两个类及其各自的接口,我想在其中创建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。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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