Java 使用POJO作为hibernate实体的基础
我最近开始用Java进行开发,我的客户也是一名开发人员,自Java发布以来一直在用Java进行开发 所以当他说“我们有一个很好的理由为什么不在我们的项目中使用瞬态场”,我没有问这些理由是什么。但是,回到问题上来: 我有两门课:Java 使用POJO作为hibernate实体的基础,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我最近开始用Java进行开发,我的客户也是一名开发人员,自Java发布以来一直在用Java进行开发 所以当他说“我们有一个很好的理由为什么不在我们的项目中使用瞬态场”,我没有问这些理由是什么。但是,回到问题上来: 我有两门课: POJO,仅用于生成JSON: 实体: 实体类是否可以扩展此POJO并动态添加列注释?还是将POJO作为接口?还是在POJO构造函数中使用实体类 早些时候,我们有这样的事情: for (Sector sector : sectors) { BaseSector b
for (Sector sector : sectors) {
BaseSector baseSector = new BaseSector();
baseSector.setId(sector.getId());
baseSector.setName(sector.getName());
baseSector.setParentId(sector.getParentId());
}
但我通过在HQL构造函数中使用BaseSector改变了这一点。。。
顺便说一句,我们还有SectorInfo和SimpleSectorInfo,它们也扩展了BaseSector,但这是一个不同的主题。aTRANSIENT字段告诉您的ENTITY类,此特定字段不应保留在DB中
@Transient
注释用于忽略JPA中数据库中不持久的字段,其中asTransient
关键字用于从序列化中忽略字段。用@Transient
注释的字段仍然可以序列化,但是用Transient
关键字声明的字段不被持久化,也不被序列化
POJO可以由实体扩展,反之亦然。这在JPA规范中有说明。您可以在以下链接中找到更多示例:
您可以通过使用注释来实现这一点:@javax.persistence.MappedSuperclass
它声明:如果在类级别上未使用诸如@entity或@MappedSuperclass之类的映射相关注释,则将超类视为非实体类。
这意味着,如果在超类中不使用上述注释,超类将被视为非实体类
如何构造类:
超类,它也是JSON对象的POJO
@MappedSuperclass
public class BaseSector implements Serializable {
private String id;
private String name;
private String parentId;
}
实体类别:
@Entity
@Table(name = "sector")
public class Sector extends BaseSector {
@Column(length = 36)
private String id;
@Column(length = 40)
private String name;
@Column(length = 36)
private String parentId;
// ... Bunch of other field
}
您还可以覆盖实体扇区中BaseSector定义的某些属性
你需要使用
@AttributeOverride // for single property
@AttributeOverrides // override more than one property
一个瞬态字段告诉您的实体类,该特定字段不应持久存在于数据库中
@Transient
注释用于忽略JPA中数据库中不持久的字段,其中asTransient
关键字用于从序列化中忽略字段。用@Transient
注释的字段仍然可以序列化,但是用Transient
关键字声明的字段不被持久化,也不被序列化
POJO可以由实体扩展,反之亦然。这在JPA规范中有说明。您可以在以下链接中找到更多示例:
您可以通过使用注释来实现这一点:@javax.persistence.MappedSuperclass
它声明:如果在类级别上未使用诸如@entity或@MappedSuperclass之类的映射相关注释,则将超类视为非实体类。
这意味着,如果在超类中不使用上述注释,超类将被视为非实体类
如何构造类:
超类,它也是JSON对象的POJO
@MappedSuperclass
public class BaseSector implements Serializable {
private String id;
private String name;
private String parentId;
}
实体类别:
@Entity
@Table(name = "sector")
public class Sector extends BaseSector {
@Column(length = 36)
private String id;
@Column(length = 40)
private String name;
@Column(length = 36)
private String parentId;
// ... Bunch of other field
}
您还可以覆盖实体扇区中BaseSector定义的某些属性
你需要使用
@AttributeOverride // for single property
@AttributeOverrides // override more than one property
在运行时添加注释是可能的,但是-这很有技巧,可以在这里找到一个例子:在运行时添加注释是可能的,但是-这很有技巧,可以在这里找到一个例子:我有点熟悉transient关键字(和注释,但transient关键字是我想要使用的),但是感谢您的重述。你能解释一下为什么使用它们是不好的做法吗?我想我们可能不想实例化更重的实体类,只是为了将3个属性导出到json?另一方面,我希望避免在两个类中使用相同的属性,即getter和setter。。。也许将BaseSector作为一个实体类并在Sector中扩展它会很好,但这是否与对象只应做一件事的原则相冲突?我有点熟悉瞬态关键字(和注释,但瞬态关键字是我想要使用的),但感谢您的重述。你能解释一下为什么使用它们是不好的做法吗?我想我们可能不想实例化更重的实体类,只是为了将3个属性导出到json?另一方面,我希望避免在两个类中使用相同的属性,即getter和setter。。。也许将BaseSector作为一个实体类并在Sector中扩展它会很好,但这是否与对象只能做一件事的原则相冲突?