Как работать с интерфейсами и JPA - программирование
Подтвердить что ты не робот

Как работать с интерфейсами и JPA

Я должен начать, сказав, что я довольно новичок в 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 непосредственно в Entity?

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

4b9b3361

Ответ 1

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