Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用POJO作为hibernate实体的基础_Java_Hibernate_Hibernate Mapping - Fatal编程技术网

Java 使用POJO作为hibernate实体的基础

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

我最近开始用Java进行开发,我的客户也是一名开发人员,自Java发布以来一直在用Java进行开发

所以当他说“我们有一个很好的理由为什么不在我们的项目中使用瞬态场”,我没有问这些理由是什么。但是,回到问题上来:

我有两门课:

  • POJO,仅用于生成JSON:
  • 实体:
  • 实体类是否可以扩展此POJO并动态添加列注释?还是将POJO作为接口?还是在POJO构造函数中使用实体类

    早些时候,我们有这样的事情:

    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中数据库中不持久的字段,其中as
    Transient
    关键字用于从序列化中忽略字段。用
    @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中数据库中不持久的字段,其中as
    Transient
    关键字用于从序列化中忽略字段。用
    @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中扩展它会很好,但这是否与对象只能做一件事的原则相冲突?