Hibernate和@JoinFormula:org.hibernate.mapping.Formula无法转换为org.hibernate.mapping.Column
我正在尝试为旧的数据库架构编写一个hibernate适配器。该模式没有专用的id列,但是使用了大约三列来连接数据。
在某些表上,我需要使用合并。到目前为止,这是我想出的:
关于定义:
- 汽车可以具有由汽车用户或汽车用户组分配的元素。
- 如果FORIGN_ELEMENT持有用户名,则定义为’u’
- 如果FORIGN_ELEMENT持有组名,则定义为’g’
- 这也意味着滥用了一个表(CAR_TO_ELEMENT)将汽车映射到元素,并将汽车组映射到元素。我定义了一个超类CarElement并将其子类CarUserElement和CarGroupElement组成。
- 状态为“活动”或无趣的字符串
- 我在其他地方设置了定义并声明状态,我们不必为此担心。
- 在联接表上使用DEP_NR。如果为零,请使用USR_DEP_NR。我在本
COALESCE(NULLIF())
机SQL中成功地做到了这一点,并希望在Hibernate中使用Pojos实现相同的目的。
好的,下面是代码:
@Entity
@Table(name="CAR")
public class Car extends TableEntry implements Serializable {
@Id
@Column(name="DEP_NR")
private int depnr;
@Id
@Column(name="USER_NAME")
@Type(type="TrimmedString")
private String username;
@ManyToOne(fetch = FetchType.EAGER, targetEntity=CarGroup.class)
@JoinColumns(value={
@JoinColumn(name="GROUP_NAME"),
@JoinColumn(name="DEP_NR"),
@JoinColumn(name="state"),
})
private CarGroup group;
@OneToMany(fetch=FetchType.EAGER, targetEntity=CarUserElement.class, mappedBy="car")
private Set<CarUserElement> elements;
}
@Entity
@Table(name="CAR_GROUP")
public class CarGroup extends TableEntry implements Serializable {
@Id
@Column(name="DEP_NR")
private int depnr;
@Id
@Column(name="GROUP_NAME")
@Type(type="TrimmedString")
private String group;
@ManyToOne(fetch = FetchType.EAGER, targetEntity=Car.class)
@JoinColumns(value={
@JoinColumn(name="GROUP_NAME"),
@JoinColumn(name="DEP_NR"),
@JoinColumn(name="state"),
})
private Set<Car> cars;
@OneToMany(fetch=FetchType.EAGER, targetEntity=CarGroupElement.class, mappedBy="car")
private Set<CarGroupElement> elements;
}
@MappedSuperclass
public class CarElement extends TableEntry {
@Id
@ManyToOne(fetch = FetchType.EAGER, targetEntity=Element.class)
@JoinColumns(value={
@JoinColumn(name="ELEMENT_NAME"),
@JoinColumn(name="state"),
})
private Element element;
}
@Entity
@Table(name="CAR_TO_ELEMENT")
public class CarUserElement extends CarElement {
@Id
@Column(name="DEFINITION")
private char definition;
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumnsOrFormulas(value = {
@JoinColumnOrFormula(formula=@JoinFormula(value="COALESCE(NULLIF(DEP_NR, 0), USR_DEP_NR)", referencedColumnName="DEP_NR")),
@JoinColumnOrFormula(column=@JoinColumn(name="FORIGN_ELEMENT", referencedColumnName="USER_NAME")),
@JoinColumnOrFormula(column=@JoinColumn(name="STATE", referencedColumnName="STATE"))
})
private Car car;
}
@Entity
@Table(name="CAR_TO_ELEMENT")
public class CarGroupElement extends CarElement {
@Id
@Column(name="DEFINITION")
private char definition;
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumnsOrFormulas(value = {
@JoinColumnOrFormula(formula=@JoinFormula(value="COALESCE(NULLIF(DEP_NR, 0), USR_DEP_NR)", referencedColumnName="DEP_NR")),
@JoinColumnOrFormula(column=@JoinColumn(name="FORIGN_ELEMENT", referencedColumnName="GROUP_NAME")),
@JoinColumnOrFormula(column=@JoinColumn(name="STATE", referencedColumnName="STATE"))
})
private Car car;
}
我尝试了所有可用的hibernate版本(从3.5.1
[带@JoinColumnsOrFormulas
]的第一个版本到4.xx),但是我总是收到此错误:
Exception in thread "main" java.lang.ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:351)
at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1338)
at org.hibernate.cfg.annotations.CollectionBinder.bindOneToManySecondPass(CollectionBinder.java:791)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:719)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:668)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1597)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1355)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1788)
其他hibernate用户似乎也有相同的问题:他们无法在任何版本上使用它,请参见此线程和其他stackoverflow问题:https
:
//forum.hibernate.org/viewtopic.php?
f =1& t
=1010559
为了更完整,这是我的TrimmedString类:https
://forum.hibernate.org/viewtopic.php
?
p
=
2191674
&
sid
=
049b85950db50a8bd145f9dac49a5f6e#p2191674
提前致谢!
PS:它仅通过一个DEP-NR-Column(即,仅使用@JoinColumns使用DEP_NR 或
USR_DEP_NR)就可以将这三个库伦加入到一起。但是我需要这个coalesce(nullif())
。
-
暂时,联接公式在Hibernate中非常脆弱。我一直很难让他们正常工作。
通常,对我有用的解决方法是创建数据库视图,以显示适当的列(包括原始表中不存在的外键)。然后,我使用分类Hibernate / JPA映射将实体映射到视图。
有时,使用此类实体时,生成的SQL中会有多余的联接,但是在大多数情况下,数据库会优化此类查询,因此无论如何执行计划都是最佳的。
另一种方法可能是使用@Subselects,这是某种Hibernate视图,但是我希望它们的性能不如经典数据库视图。
-
failed.org.hibernate.MappingException:无法确定类型:字符串,用于列:[org.hibernate.mapping.Column(db col name)
2021-02-01 关注 0 浏览106 1答案
-
org.hibernate.MappingException:无法确定类型:java.util.List,在表:College,用于列:[org.hibernate.mapping.Column(students)]
2021-02-01 关注 0 浏览103 1答案
-
org.hibernate.MappingException:无法确定类型:java.util.Set,在表:USERS,用于列:[org.hibernate.mapping.Column(invoices)]
2021-02-01 关注 0 浏览105 1答案
-
Spring 3.1 Hibernate 4继承的异常[无法转换为org.hibernate.mapping.RootClass]
2021-02-02 关注 0 浏览70 1答案
-
Spring 3.1 Hibernate 4继承的异常[无法转换为org.hibernate.mapping.RootClass]
2021-02-01 关注 0 浏览144 1答案
-
org.hibernate.MappingException:无法确定以下列的类型:java.util.List,位于表:College,对于列:[org.hibernate.mapping.Column(students)]
2021-02-02 关注 0 浏览88 1答案
-
Spring 4 + Hibernate 5 = org.springframework.orm.jpa.EntityManagerHolder无法转换为org.springframework.orm.hibernate5.SessionHolder
2021-02-01 关注 0 浏览90 1答案
-
ClassCastException:org.springframework.orm.jpa.EntityManagerHolder无法转换为org.springframework.orm.hibernate5.SessionHolder
2021-02-02 关注 0 浏览111 1答案
-
将Hibernate @Formula转换为JOOQ字段
2021-02-01 关注 0 浏览97 1答案
-
org.hibernate.HibernateException:无法实例化默认tuplizer[org.hibernate.tuple.entity.PojoEntityTuplizer]
2021-02-01 关注 0 浏览77 1答案