【发布时间】:2017-12-04 21:16:39
【问题描述】:
我是 spring/hibernate 的新手。我编写了一个 web 服务,它应该返回完整的对象,有时还会返回缩减的对象。例如,我有一个从 MemberBase 类继承的 Member 类:
...
**
* MemberBase
*/
@Entity
@Table(name = "MemberBase")
@Inheritance(strategy = InheritanceType.JOINED)
@SequenceGenerator(name = "idgen", sequenceName = "seq_Member")
public class MemberBase extends BasePojo {
@Column(name = "alias")
private String alias = null;
@Column(name = "firstName")
private String firstName = null;
@Column(name = "gender")
@Enumerated(EnumType.STRING)
private Gender gender = null;
@Transient
@OneToMany(fetch = FetchType.LAZY, mappedBy = "creator")
@ElementCollection(targetClass=OutingBase.class)
private Set<OutingBase> outings = null;
...
}
和会员:
...
/**
* Member
*/
@Entity
@Table(name = "Member")
@SequenceGenerator(name = "idgen", sequenceName = "seq_Member")
public class Member extends MemberBase {
@Enumerated(EnumType.STRING)
private MaritalStatus maritalStatus = null;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
private LocalDate birthDate = null;
private String locationName = null;
private DateTime lastConnexion = null;
private String description = null;
private String videoMoodUrl = null;
private String mood = null;
private Boolean canCertify = null;
private String fid = null;
...
}
在我的控制器中,我使用休眠来获取成员库列表:
public ResponseEntity<List<MemberBase>> membersGet() {
Session session = HibernateUtils.getSessionFactory().openSession();
session.beginTransaction();
List<MemberBase> personList = session.createQuery("FROM " + MemberBase.class.getName(), MemberBase.class)
.getResultList();
session.close();
return new ResponseEntity<List<MemberBase>>(personList, HttpStatus.OK);
}
这是我创建会话工厂的方式:
private static SessionFactory buildSessionFactory() {
try {
Configuration configuration = new Configuration().configure();
configuration.addAnnotatedClass(BasePojo.class);
configuration.addAnnotatedClass(MemberBase.class);
configuration.addAnnotatedClass(Member.class);
configuration.addAnnotatedClass(OutingBase.class);
configuration.addAnnotatedClass(Outing.class);
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
return configuration.buildSessionFactory(builder.build());
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
我的问题是,当我调用membersGet() 时,我检索到的是List<Member>,而不是List<MemberBase> 的列表。没有崩溃,但是我的序列化 Json 包含的字段太多。我实现了这种继承以避免获取所有Member 的字段。我做错了什么?
【问题讨论】:
标签: spring hibernate inheritance