有没有办法将实体加载到派生类的实例中?

时间:2011-09-16 09:43:52

标签: java spring jpa

我有一个从实体派生的实体和专门的类。 让JPA创建派生类的实例而不是实体类是否有任何方法(在JPA或spring中有些棘手)?

否则我需要为每个派生类创建'copy constructors'。或者用似乎笨重的代表取代继承。

3 个答案:

答案 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
}