如何使用接口和JPA

Nik*_*rin 19 java jpa interface java-ee java-ee-6

我应该首先说我是Java EE的新手,我还没有扎实的Java理论背景.

我在掌握如何JPAinterfacesJava 一起使用时遇到了麻烦.为了说明我发现的困难,我创建了一个非常简单的例子.

如果我有两个简单的接口PersonPet:

public interface Person
{
    public Pet getPet();
    public void setPet(Pet pet);
}

public interface Pet
{
    public String getName();
}
Run Code Online (Sandbox Code Playgroud)

而一个实体PersonEntity,它实现Person还有一个PetEntity它实现了Pet:

@Entity
public class PersonEntity implements Person
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private PetEntity pet;

    @Override
    public void setPet(Pet pet)
    {
        /* How do i solve this? */
    }
}

@Entity
public class PetEntity implements Pet
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    /* Getters and Setters omitted */

}
Run Code Online (Sandbox Code Playgroud)

如何setPet在我希望保持上述两个实体之间关系的方法中正确处理案例?

我想使用接口的主要原因是因为我想保持模块/层之间的依赖关系到公共接口.我怎样才能避免从我的ManagedBean直接获取实体的依赖?

如果有人建议不要在实体上使用接口,那么请解释有哪些替代方法或模式.

Mai*_*kov 18

您可以targetEntity在关系注释中使用属性.

@Entity
public class PersonEntity implements Person {
    private Long id;

    private Pet pet;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    @OneToOne(targetEntity = PetEntity.class)
    public Pet getPet() {
        return pet;
    }        

    public void setPet(Pet pet) {
        this.pet = pet;
    }
}
Run Code Online (Sandbox Code Playgroud)