JPA鉴别器列问题

时间:2011-01-16 15:13:21

标签: java jpa subclass

你好。 我有这套课程:

@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

2 个答案:

答案 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”作为指标。