代码之家  ›  专栏  ›  技术社区  ›  Freiheit

是否可以通过扩展pojo来构建jpa实体?

  •  52
  • Freiheit  · 技术社区  · 15 年前

    假设我有以下POJO:

    public class MyThing {
     private int myNumber;
     private String myData;
    //assume getter/setter methods
    }
    

    现在是否可以将这个pojo扩展为jpa实体?

    @Entity
    @Table(name = "my_thing")
    public class MyThingEntity extends MyThing implements Serializable {
     @Column(name = "my_number")
     //?????????
     @Column(name = "my_data")
     //????????
    }
    

    我想把pojo与jpa实体分开。pojo存在于另一个项目中,经常在没有持久层的情况下使用,我的项目希望将其持久化在数据库中,这样做时就不会有从pojo映射到实体并返回的开销。

    我知道jpa实体是pojo,但是为了使用它,我必须包含一个实现javax.persistence的库,并且其他使用相同基本对象的项目对于持久层没有用处。

    这可能吗?这是个好主意吗?

    2 回复  |  直到 8 年前
        1
  •  70
  •   Martin    8 年前

    JPA规范状态

    实体 可以扩展非实体类和实体类 ,非实体类可以扩展实体类。

    @MappedSuperclass注释允许您定义这种映射

    @MappedSuperclass
    public class MyThing implements Serializable {
        private int myNumber;
        private String myData;
    
        // getter's and setter's
    }
    

    @Entity
    @Table(name="MY_THING")
    public class MyThingEntity extends MyThing {
    
    
    }
    

    如jpa规范所述

    MappedSuperclass注释指定一个类 其映射信息应用于从其继承的实体 .

    用MappedSuperclass注释指定的类 可以以与实体相同的方式映射,但映射将仅应用于其子类 因为映射的超类本身不存在表。

    如果需要重写由mything定义的某些属性,请使用@attributeoverride(当您要重写单个属性时)或@attributeoverrides(当您要重写多个属性时)

    @Entity
    @Table(name="MY_THING")
    @AttributeOverride(name="myData", column=@Column(name="MY_DATA"))
    public class MyThingEntity extends MyThing {
    
    
    }
    

    @Entity
    @Table(name="MY_OTHER_THING")
    @AttributeOverrides({
        @AttributeOverride(name="myData1", column=@Column(name="MY_DATA_1")),
        @AttributeOverride(name="myData2", column=@Column(name="MY_DATA_2"))
    })
    public class MyOtherThingEntity extends MyThing {
    
    }
    

    如果不想更改基类,可以使用XML将其定义为@MappedSuperclass

    注意:默认情况下,持久性提供程序将在META-INF目录中查找名为orm.xml的文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
        <mapped-superclass class="MyThing">
    
        </mapped-superclass>
    </entity-mappings>
    

    没有别的 . 如果要重写属性,请使用@attributeoverride,如上所示

        2
  •  6
  •   Bozho    15 年前

    有可能:

    • 您可以用XML映射它-使 orm.xml (符合 orm schema ,并映射pojo的列,甚至不扩展它。它将在一个环境中启用jpa,在另一个环境中启用pojo
    • 只重写getter方法并对其进行注释(我不确定这是否有效)

    也就是说,我认为没有必要这样做。只需注释您的pojo,并将编译时依赖项添加到您的项目中。然后每个项目将决定是否将它们用作jpa实体。