Как работать с интерфейсами и JPA - PullRequest
18 голосов
/ 23 января 2012

Я должен начать с того, что я довольно новичок в Java EE и у меня пока нет сильных теоретических знаний в Java.

Мне сложно понять, как использовать JPA вместе с interfaces в Java. Чтобы проиллюстрировать то, что мне трудно, я создал очень простой пример.

Если у меня есть два простых интерфейса Person и Pet:

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

public interface Pet
{
    public String getName();
}

И сущность 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 */

}

Как правильно обработать регистр в методе setPet, в котором я хочу сохранить отношения между двумя сущностями выше?

Основная причина, по которой я хочу использовать интерфейсы, заключается в том, что я хочу сохранить зависимости между модулями / слоями для открытых интерфейсов. Как еще мне избежать получения зависимости, например, от мой ManagedBean напрямую к сущности?

Если кто-то рекомендует не использовать интерфейсы на объектах, объясните, пожалуйста, какие существуют альтернативные методы или шаблоны.

1 Ответ

18 голосов
/ 23 января 2012

Вы можете использовать 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;
    }
}
...