单表的多个POJO /实体

时间:2013-12-30 09:08:44

标签: java spring hibernate spring-mvc entities

有谁知道如何为一个表创建多个POJO /实体? 没有得到DuplicateEntitites错误?

我需要多个pojos的原因是我想在某些情况下隐藏一些属性。

感谢您的时间。

更新:我如何实施Hrishikesh的建议。

@Entity(name="baseT1")
@Table(name="T1")
   public class BaseT1{
}

@Entity(name="T1")
@Table(name="T1")
   public class T1 extends BaseT1{
}

这给了我:

Invocation of init method failed; nested exception is     
org.hibernate.DuplicateMappingException: Duplicate table mapping T1

错误。

5 个答案:

答案 0 :(得分:2)

嗯,我的意思是这样的。

@Entity
@Table(name="T1")
public class BaseT1{

private String column1;
private String column2;

}

@Entity
@Table(name="T1")
public class BaseT2{

private String column1;

}

类BaseT1和BaseT2都映射到相同的T1表,但定义的属性较小,您将映射到实际的表列。这是最简单的方法之一。当然,除非你有一个区分值,比如record_type,它区分表中的两种类型的条目。 然后你必须使用@jhadesdev

提到的Discriminator解决方案

答案 1 :(得分:0)

Java类(实体)的类名需要不同,然后您可以将同一个表映射到多个Java类。

答案 2 :(得分:0)

如果表格中有一些列可以区分不同的情况,请使用Single table per class hierarchy strategy

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name="planetype",
    discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue("Plane")
public class Plane { ... }

@Entity
@DiscriminatorValue("A320")
public class A320 extends Plane { ... }    

如果鉴别器列不存在或无法使用存储过程创建,则hibernate本身支持SQL @DiscriminatorFormula

答案 3 :(得分:0)

您只需使用@MappedSuperClass

http://docs.jboss.org/hibernate/core/3.5/javadocs/org/hibernate/mapping/MappedSuperclass.html

@MappedSuperclass
class BaseT1 {
    // add your properties and constraints here
}


@Entity
class T1 extends BaseT1 {
}

答案 4 :(得分:-1)

是的,我试过这个,可以使用一个pojo类将数据保存并检索到两个表中。

  

使用Hibernate-polymorphism支持将一个POJO类映射到两个表

第一

Create SecondaryEntityUserB.hbm.xml Mention `<class 
name="PrimaryEntityUserA" 
table="user_b"
entity-name ="SecondaryEntityUserB"
polymorphism = "explicit" >`

第二

PrimaryEntityUserA myObject = new PrimaryEntityUserA();
myObject.setId( new Long( 10 ) );
myObject.setName( "Tayaba" );
String entityName = "PrimaryEntityUserA";
session.save( entityName, myObject );
entityName = "SecondaryEntityUserB";
session.save( entityName, myObject );>
  

保存

List<PrimaryEntityUserA> usersA=LuminaHibernateUtil.getUtil().getList(session.createQuery( "from PrimaryEntityUserA a" ) );
if ( !usersA.isEmpty() ) {
    for ( PrimaryEntityUserA a : usersA ) {
        System.out.println( "Name from first table \t" + a.getName());              
   }
}
List<PrimaryEntityUserA> usersB =LuminaHibernateUtil.getUtil().getList(session.createQuery( "from SecondaryEntityUserB a" ) );
if ( !usersB.isEmpty() ) {
    for ( PrimaryEntityUserA b : usersB ) {
        System.out.println( "Name from sesond table \t" + b.getName() );                
     }
}
  

要检索

Regards
Naziya Tayaba

结论:我们可以在两个hbm文件中使用2个不同的表和entity-name属性并提及相同的名称属性值,也提到了polymorphism =&#34; explicit&#34;在secondaryentity.hbm.xml中。

请找到相同的有用链接: more recent Oracle documentation

[http://snaike.blogspot.in/2009/04/mapping-java-object-to-two-tables-using.html

ALTER TABLE foo MODIFY bar VARCHAR2(255) NOT NULL;