我有一个从实体派生的实体和专门的类。 让JPA创建派生类的实例而不是实体类是否有任何方法(在JPA或spring中有些棘手)?
否则我需要为每个派生类创建'copy constructors'。或者用似乎笨重的代表取代继承。
答案 0 :(得分:2)
如果您的实体有许多应该以不同方式存储在数据库中的子类,您可以使用JPA继承支持(@Inheritance
等)。
如果您的实体只有一个子类应该总是用来代替该实体,那么您可以将该子类注释为@Entity
,将实体注释为@MappedSuperclass
。
如果要在不修改实体的情况下实现上一个案例,可以使用特定于提供者的解决方案。例如,在Hibernate中,您可以注册自定义Interceptor
并覆盖其instantiate()
方法。
答案 1 :(得分:1)
如果您只想要实体的一部分属性并且不想更改实体,那么我建议使用摘要样式查询。
@Entity
@Table(name="test_entity")
public class TestEntity extends BaseDomainObject<Long> {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name")
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class TestSummary {
private final Long id;
private final String name;
public TestSummary(Long id, String name) {
super();
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
}
然后你可以使用这样的查询:
select new TestSummary(te.id, te.name) from TestEntity te
JPA将生成一个仅加载所需字段的快速查询。我在显示实体列表时一直使用它。
答案 2 :(得分:0)
我现在使用lomboks delegate注释解决了它。
@Entity
public class MyEntity {
...
}
public class MyBusinessObject {
@Delegate
private MyEntity entity;
// other non persistent stuff
}