class MyFile{
  @Embedded
  FileHeader header;  // getter/setter
}@Embeddable
abstract class FileHeader{  // @Embeddable 能是Abstract吗?
}@Embeddable
class MyFileHeader{
  //...
}main(..){ MyFile myFile = new MyFile();
 myFile.setHeader(new MyFileHeader());    //以此实现多态,JPA支持吗?
}
  

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【blacksky115】截止到2008-06-25 10:44:16的历史汇总数据(不包括此帖):
    发帖数:3                  发帖分:230                
    结贴数:2                  结贴分:130                
    未结数:1                  未结分:100                
    结贴率:66.67 %            结分率:56.52 %            
    楼主加油
      

  2.   

    @Embeddable 类不能继承,如果你继承的话,你的父类的字段也不会被自动生成到数据库还是冗余在@Embeddable 里,或者你的entity里吧
      

  3.   

    真是不习惯用jpa,但他却如此火热。
      

  4.   

    热也是有原因的
    尝试不习惯的东西叫改变
    尝试不会的东西叫学习
    尝试会的东西叫复习
    (!@#¥(*#……¥(@&#)¥@
      

  5.   


    你说的不对,
    @Embeddable类可以继承,
    继承了的字段也可以生成到数据库中。
      

  6.   

    你测试了吗,我是在netbean里测试的
      

  7.   

    //我的例子如下,实体类是User,其中Man和Woman实体类继承自User
    //Embeddable类是BaseInfo,其中UserBaseInfo继承自BaseInfo
    @Entity
    @Table(name = "Users")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name= "BBB",discriminatorType=DiscriminatorType.INTEGER)
    public class User implements Serializable {
    @Id
        @GeneratedValue(strategy = GenerationType.TABLE, generator = "customer_gen")
        @TableGenerator(name = "customer_gen",
        table = "tb_generator",
        pkColumnName = "gen_name",
        valueColumnName = "gen_value",
        pkColumnValue = "id",allocationSize = 1)
        private Long id;
        private String name;
    @Embedded
        private BaseInfo baseInfo;
    get/set......
    }@Embeddable
    public class BaseInfo implements java.io.Serializable {
        private String baseName;
    get/set......
        
    }
    //UserBaseInfo类继承BaseInfo类
    @Embeddable
    public class UserBaseInfo extends BaseInfo implements java.io.Serializable {
        private static final long serialVersionUID = 1L;
        private String address;
        private String email;
        private String telephone;
    get/set......
    }
    //Man类继承User类
    @Entity
    @DiscriminatorValue(value="2")
    public class Man extends User implements Serializable {
        private String manName;
    get/set......
    }
    //Woman类继承User类
    @Entity
    @DiscriminatorValue(value="1")
    public class Woman extends User implements Serializable {
        private String womainName;
    get/set......
    }
    //测试类如下
    public class Main extends User {
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            Main m = new Main();
            UserBaseInfo userBaseInfo = new UserBaseInfo();
    userBaseInfo.setBaseName("haha112");
            userBaseInfo.setAddress("黑龙江");
            userBaseInfo.setEmail("[email protected]");
            Man man = new Man();
            man.setManName("男人aaaa");
            man.setBaseInfo(userBaseInfo);
    m.persist(man);
    } public void persist(Object object) {
            EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("TestjpaPU");
            EntityManager em = emf.createEntityManager();
            em.getTransaction().begin();
            try {
                em.persist(object);
                em.getTransaction().commit();
            } catch (Exception e) {
                e.printStackTrace();
                em.getTransaction().rollback();
            } finally {
                em.close();
            }
        }
    }
    persistence.xml如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
      <persistence-unit name="TestjpaPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>testjpa.User</class>
        <class>testjpa.Man</class>
        <class>testjpa.Woman</class>
        <class>testjpa.MutiKeyTable</class>
        <class>testjpa.SinglePrimary</class>
        <properties>
          <property name="hibernate.connection.username" value="sa"/>
          <property name="hibernate.connection.driver_class" value="net.sourceforge.jtds.jdbc.Driver"/>
          <property name="hibernate.connection.password" value="123456"/>
          <property name="hibernate.connection.url" value="jdbc:jtds:sqlserver://localhost:1433/testjpa"/>
          <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
          <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
      </persistence-unit>
    </persistence>数据库字段如下
    BBB  id  baseName name   manName   womanName
    2 1 haha112   NULL 男人aaaa NULL可以说明继承类的字段没有被影射到数据库如果你在User类里面把BaseInfo 换成 UserBaseInfo的话,数据库字段如下BBB  id  address         email        telephone  name  manName   womanName
    2 1 哈尔滨333333333 [email protected]   NULL  NULL 男人aaaa NULL
    可以看出BaseInfo中的baseName没有被映射到数据库代码不全,可能有不对的地方,请指正