【问题标题】:How to work with interfaces and JPA如何使用接口和 JPA
【发布时间】:2012-02-16 09:34:43
【问题描述】:

首先我应该说我对 Java EE 还很陌生,而且我还没有很强的 Java 理论背景。

我无法掌握如何在 Java 中同时使用 JPAinterfaces。为了说明我发现的困难,我创建了一个非常简单的示例。

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

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

public interface Pet
{
    public String getName();
}

还有一个实现Person 的实体PersonEntity 以及一个实现PetPetEntity

@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 直接指向一个实体?

如果有人建议不要在实体上使用接口,请说明有哪些替代方法或模式。

【问题讨论】:

    标签: java jakarta-ee jpa interface java-ee-6


    【解决方案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;
        }
    }
    

    【讨论】:

    • 你确定它会起作用吗?您正在使用隐式字段访问,但在 setter 上设置了 @OneToOne 注释。此外,即使具有属性访问权限,此注释也会起作用吗?它不应该在 getter 而不是 setter 上吗?
    • Mairbek,那么混合字段 na 属性访问呢?您是否认为 JPA 2.0 规范的这一部分在这种情况下是相关的:“在没有明确指定 Access 注释的情况下,将注释放置在实体层次结构中的字段和属性上混合的应用程序的行为是未定义的。”我>?
    • 当然只要只有 1 个 Person 实现就可以工作。当你有超过 1 个时,你需要在接口字段的实现中明确支持
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多