Ben*_*Ben 19 java sql hibernate
我正在尝试为旧的数据库模式编写一个hibernate适配器.此架构没有专用的id列,但使用大约三个其他列来连接数据.
在某些表格中,我需要使用合并.这是我到目前为止提出的:
关于定义:
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;
}
Run Code Online (Sandbox Code Playgroud)
@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;
}
Run Code Online (Sandbox Code Playgroud)
@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;
}
Run Code Online (Sandbox Code Playgroud)
@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;
}
Run Code Online (Sandbox Code Playgroud)
@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;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了所有可用的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)
Run Code Online (Sandbox Code Playgroud)
其他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)就可以加入这三个colulmns .但我需要这个coalesce(nullif()).
目前,Join 公式在 Hibernate 中非常脆弱;我总是很难让它们正常工作。
经常帮助我的解决方法是创建公开适当列(包括原始表中不存在的外键)的数据库视图。然后,我使用 Hibernate/JPA 映射类将实体映射到视图。
有时,在使用此类实体时,生成的 SQL 中会存在冗余联接,但数据库在大多数情况下会优化此类查询,以便执行计划无论如何都是最优的。
另一种方法可能是使用@Subselects,它是某种 Hibernate 视图,但我预计它们的性能不如经典数据库视图。
| 归档时间: |
|
| 查看次数: |
6954 次 |
| 最近记录: |