Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 Hibernate:与InheritanceType.Single_表中的子类的关系_Java_Hibernate_Inheritance - Fatal编程技术网

Java Hibernate:与InheritanceType.Single_表中的子类的关系

Java Hibernate:与InheritanceType.Single_表中的子类的关系,java,hibernate,inheritance,Java,Hibernate,Inheritance,MyObject有两个子类:SubObject 1和SubObject 2。现在我又有了一个实体:OtherClass。OtherClass与子对象1之间存在1:1关系,OtherClass与子对象2之间存在1:n关系 MyObject: @Entity @Table( name = "MYOBJECT" ) @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( name = "OBJ_TYP", di

MyObject有两个子类:SubObject 1和SubObject 2。现在我又有了一个实体:OtherClass。OtherClass与子对象1之间存在1:1关系,OtherClass与子对象2之间存在1:n关系

MyObject:

@Entity
@Table( name = "MYOBJECT" )
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn( name = "OBJ_TYP", discriminatorType = DiscriminatorType.STRING )
public abstract class MyObject{

     @Id
     @Column( name = "OBJ_ID")
     private Long id;

     ...
}
@Entity
@Table( name = "MYOBJECT" )
@DiscriminatorValue( value = "SUB1" )
public class SubObject1 extends MyObject{
    @OneToOne(mappedBy="subObject1")
    private OtherClass otherClass;
    ...
}
@Entity
@Table( name = "MYOBJECT" )
@DiscriminatorValue( value = "SUB2" )
public class SubObject2 extends MyObject{

    @OneToMany(mappedBy="subObject2")
    private Set<OtherClass> otherClassList;  
    ...
}
@Entity
@Table( name = "OTHER")
public class OtherClass{

    @OneToOne
    @JoinColumn(name = "OTHER_OBJ_ID", referencedColumn = "OBJ_ID", nullable=true)
    private SubObject1 subObject1;

    @ManyToOne
    @JoinColumn( name = "OTHER_OBJ_ID", referencedColumn = "OBJ_ID", nullable = true)
    private SubObject2 subObject2;

}
子对象1:

@Entity
@Table( name = "MYOBJECT" )
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn( name = "OBJ_TYP", discriminatorType = DiscriminatorType.STRING )
public abstract class MyObject{

     @Id
     @Column( name = "OBJ_ID")
     private Long id;

     ...
}
@Entity
@Table( name = "MYOBJECT" )
@DiscriminatorValue( value = "SUB1" )
public class SubObject1 extends MyObject{
    @OneToOne(mappedBy="subObject1")
    private OtherClass otherClass;
    ...
}
@Entity
@Table( name = "MYOBJECT" )
@DiscriminatorValue( value = "SUB2" )
public class SubObject2 extends MyObject{

    @OneToMany(mappedBy="subObject2")
    private Set<OtherClass> otherClassList;  
    ...
}
@Entity
@Table( name = "OTHER")
public class OtherClass{

    @OneToOne
    @JoinColumn(name = "OTHER_OBJ_ID", referencedColumn = "OBJ_ID", nullable=true)
    private SubObject1 subObject1;

    @ManyToOne
    @JoinColumn( name = "OTHER_OBJ_ID", referencedColumn = "OBJ_ID", nullable = true)
    private SubObject2 subObject2;

}
子对象2:

@Entity
@Table( name = "MYOBJECT" )
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn( name = "OBJ_TYP", discriminatorType = DiscriminatorType.STRING )
public abstract class MyObject{

     @Id
     @Column( name = "OBJ_ID")
     private Long id;

     ...
}
@Entity
@Table( name = "MYOBJECT" )
@DiscriminatorValue( value = "SUB1" )
public class SubObject1 extends MyObject{
    @OneToOne(mappedBy="subObject1")
    private OtherClass otherClass;
    ...
}
@Entity
@Table( name = "MYOBJECT" )
@DiscriminatorValue( value = "SUB2" )
public class SubObject2 extends MyObject{

    @OneToMany(mappedBy="subObject2")
    private Set<OtherClass> otherClassList;  
    ...
}
@Entity
@Table( name = "OTHER")
public class OtherClass{

    @OneToOne
    @JoinColumn(name = "OTHER_OBJ_ID", referencedColumn = "OBJ_ID", nullable=true)
    private SubObject1 subObject1;

    @ManyToOne
    @JoinColumn( name = "OTHER_OBJ_ID", referencedColumn = "OBJ_ID", nullable = true)
    private SubObject2 subObject2;

}
现在,当我有一个hql查询时,如:

FROM OtherClass c LEFT JOIN FETCH c.subObject1 LEFT JOIN FETCH c.subObject2
我得到:

java.lang.RuntimeException: org.hibernate.MappingException: Repeated column in mapping for entity: ...OtherClass column: OTHER_OBJ_ID (should be mapped with insert="false" update="false")
我知道“其他对象ID”列重复出现。但是为什么我不能那样做呢?我认为hibernate可以找出应该存在哪种类型的实体,因为声明了鉴别器值。我真的不想在另一个表中添加列。是否可以在不添加新列并分离obj1和obj2的情况下执行此操作


请帮帮我

您别无选择,只能在映射中使用不同的列,或者使用一个单一的MyObject集合,让Java代码或HQL获取您要查找的子类。

AFAIK,不,这是不可能的。假设我初始化bith subObject1和subObject2,那么在unique列中Hibernate stre将是什么?应用程序的上下文不允许这两种情况。所以这永远不会发生。但是Hibernate不知道上下文。它将一个关联映射到一列,仅此而已。是否可以告诉hibernate其中至少有一个始终为空?我可以更改java模型,但如果可能的话,我不想更改数据库。不,我不这么认为。