Java Hibernate:与InheritanceType.Single_表中的子类的关系
MyObject有两个子类:SubObject 1和SubObject 2。现在我又有了一个实体:OtherClass。OtherClass与子对象1之间存在1:1关系,OtherClass与子对象2之间存在1:n关系 MyObject: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
@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模型,但如果可能的话,我不想更改数据库。不,我不这么认为。