@Entity
@Table(name = "S_MC_CC_RAPPORTI")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="COD_TIPORAPPORTO",
discriminatorType=DiscriminatorType.CHAR, length=1)
public abstract class Rapporto implements Serializable {
private static final long serialVersionUID = -5567166522882040440L;
@Id
@Column(name = "COD_RAPPORTO")
protected Long codiceRapporto;
这个子类:
@Entity
@Table(name="S_MC_CC_CCCLIENTI")
@DiscriminatorValue("1 ")
public class ContoCorrente extends Rapporto {
private static final long serialVersionUID = -3380622649760983262L;
@Column(name = "DESC_DIVISA")
private String divisa;
问题出在鉴别器值上:在表上,列是CHAR(2)。
当我在子类上创建getItemById时,一切正常:这是生成的eclipselink sql :(我用*替换了列定义以便于阅读)
[EL Fine]: 2011-01-16 16:01:14.531--ServerSession(5230193)--Connection(11601738)--Thread(Thread[main,5,main])-- SELECT * FROM S_MC_CC_RAPPORTI t0, S_MC_CC_CCCLIENTI t1 WHERE ((t0.COD_RAPPORTO = ?) AND ((t1.COD_RAPPORTO = t0.COD_RAPPORTO) AND (t0.COD_TIPORAPPORTO = ?)))
bind => [1120676, 1 ]
如果我更改@DiscriminatorValue("1")
删除空格,则找不到数据:这是相对生成的sql
[EL Fine]: 2011-01-16 16:03:46.671--ServerSession(5230193)--Connection(11601738)--Thread(Thread[main,5,main])--SELECT * FROM S_MC_CC_RAPPORTI t0, S_MC_CC_CCCLIENTI t1 WHERE ((t0.COD_RAPPORTO = ?) AND ((t1.COD_RAPPORTO = t0.COD_RAPPORTO) AND (t0.COD_TIPORAPPORTO = ?)))
bind => [1120676, 1]
请注意,这两个查询在TOAD中运行良好:t0.COD_TIPORAPPORTO ='1',即使是t0.COD_TIPORAPPORTO ='1'。
好的:所以我认为@DiscriminatorValue("1 ")
是正确的。
现在我按照所描述的here
与超类Rapporto进行多对多关联如果我保留@DiscriminatorValue("1 ")
我得到
[EL Warning]: 2011-01-16 16:09:33.421--ServerSession(29839159)--Thread(Thread[main,5,main])--Exception [EclipseLink-43] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class for indicator field value [1] of type [class java.lang.String].
Descriptor: RelationalDescriptor(it.alten.intesasanpaolo.contratto.domain.core.rapporto.Rapporto --> [DatabaseTable(S_MC_CC_RAPPORTI)])
如果我更改@DiscriminatorValue("1")
删除空格一切正常,但我没有收到任何数据(即使数据存在于数据库中)。
我不知道该做什么...... 有什么想法吗?
亲切的问候
的Massimo
答案 0 :(得分:2)
数据库中的值似乎包含尾随空格。我建议对表运行查询并删除尾随空格。然后将鉴别器值设为"1"
(无空格)
事实上,如果你打算使用数字,你应该使用DiscriminatorType.INTEGER
答案 1 :(得分:2)
使用绑定时,您的数据库似乎存在与空格进行char比较的问题。你在用什么数据库?
有几种可能的解决方案,首先我会检查你的JDBC驱动程序,看它是否有任何修复或选项来解决这个问题。
一个选项是在persistence.xml中设置“eclipselink.jdbc.bind-parameters”=“false”,这应该可以解决问题。
另一个解决方案是在EclipseLink中禁用char修剪(这个似乎没有暴露给JPA持久性属性(请记录一个bug),所以你需要使用SessionCustomizer来设置它) session.getLogin()setShouldTrimStrings(假);
更复杂的解决方案是使用DescriptorCustomizer在描述符上设置您自己的ClassExtractor,以使用您自己的代码来确定类。
如果您可以更改数据,那么我建议您只将“1”更新为“01”,然后您可以使用“01”作为指标。