如何使用接口和 JPA
Posted
技术标签:
【中文标题】如何使用接口和 JPA【英文标题】:How to work with interfaces and JPA 【发布时间】:2012-02-16 09:34:43 【问题描述】:首先我应该说我对 Java EE 还很陌生,而且我还没有很强的 Java 理论背景。
我无法掌握如何在 Java 中同时使用 JPA
和 interfaces
。为了说明我发现的困难,我创建了一个非常简单的示例。
如果我有两个简单的接口Person
和Pet
:
public interface Person
public Pet getPet();
public void setPet(Pet pet);
public interface Pet
public String getName();
还有一个实现Person
的实体PersonEntity
以及一个实现Pet
的PetEntity
:
@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】:您可以在关系注释中使用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 个时,你需要在接口字段的实现中明确支持以上是关于如何使用接口和 JPA的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JPA 和 Spring 在列表中查找具有字段的不同行?
如何在实现 Spring Data JPA AuditorAware 接口时获取 getUserPrincipal().getUserName()