Java 在复合键中使用JoinColumns时类型描述符错误

Java 在复合键中使用JoinColumns时类型描述符错误,java,hibernate,jpa,Java,Hibernate,Jpa,我一直在绞尽脑汁,试图找出以下映射的错误。我知道下面的映射不适合ORM,但数据库就是这样的,我不能改变它的结构。我正在使用JPA2.1和Hibernate5.0.2.Final @MappedSuperclass public abstract class BaseEntity<T extends Serializable> implements Serializable { protected T id; @Id public T getId()

我一直在绞尽脑汁,试图找出以下映射的错误。我知道下面的映射不适合ORM,但数据库就是这样的,我不能改变它的结构。我正在使用JPA2.1和Hibernate5.0.2.Final

@MappedSuperclass    
public abstract class BaseEntity<T extends Serializable> implements Serializable {

    protected T id;

    @Id
    public T getId() {
        return id;
    }

    protected void setId(T id) {
        this.id = id;
    }
}




除了这个结构之外,我还有一个转换器来处理LocalDate到
java.sql.Date
,它用
autoApply=true
注释

当我试图通过
entityManager.find()
加载
CampaignBroadcastProcess
时,hibernate尝试将
campaign\u id
转换为日期,即使它映射为字符串,也会导致
java.sql.Date
引发
IllegalStateException
,因为传递给
valueOf
的字符串不是有效的日期字符串

我怀疑Hibernate混淆了
ActivityBroadcastProcessPK
上JoinColumns的类型,将它们都作为LocalDate处理


有人曾经遇到过这个问题吗?

尝试在您的
@JoinColumn
中添加显式的referencedColumnName。您描述的错误可能是由于组合键列的隐式映射顺序错误造成的

@ManyToOne
@JoinColumns({
    @JoinColumn(name = "campaign_id", referencedColumnName = "campaign_id", ...),
    @JoinColumn(name = "broadcast_date", referencedColumnName = "broadcast_date", ...) })
private CampaignBroadcast broadcast;

我不太清楚原因,但改变两个
@joincolm
的顺序解决了这个问题。现在的映射如下所示:

@ManyToOne
@JoinColumns({ 
    @JoinColumn(name = "broadcast_date", insertable = false, updatable = false),
    @JoinColumn(name = "campaign_id", insertable = false, updatable = false)     
})
private CampaignBroadcast broadcast;

我认为这是因为hibernate选择了第一个数据类型,即数据类型,并将其映射到联接列

,这实际上就是我所说的-顺序错误的隐式映射。考虑使用显式绑定,而不是依赖于注释No.No的隐式命令,情况并非如此,因为即使引用了CyrnNeN名字,映射也不起作用。
@Entity
@Table(name = "campaign_broadcast")
public class CampaignBroadcast implements Serializable {

    @EmbeddedId
    private CampaignBroadcastPK id;

    // attributes, getters and setters
}
@Embeddable
public class CampaignBroadcastProcessPK implements Serializable {

   @ManyToOne
   @JoinColumns({ 
       @JoinColumn(name = "campaign_id", insertable = false, updatable = false),
       @JoinColumn(name = "broadcast_date", insertable = false, updatable = false) 
    })
    private CampaignBroadcast broadcast;

    @Column(name = "process_date)
    private LocalDate processDate;

    // getters and setters
}
@Entity
@Table(name = "campaign_broadcast_process")
public class CampaignBroadcastProcess implements Serializable {

    @EmbeddedId
    private CampaignBroadcastProcessPK id;

    // attributes, getters and setters
}
@ManyToOne
@JoinColumns({
    @JoinColumn(name = "campaign_id", referencedColumnName = "campaign_id", ...),
    @JoinColumn(name = "broadcast_date", referencedColumnName = "broadcast_date", ...) })
private CampaignBroadcast broadcast;
@ManyToOne
@JoinColumns({ 
    @JoinColumn(name = "broadcast_date", insertable = false, updatable = false),
    @JoinColumn(name = "campaign_id", insertable = false, updatable = false)     
})
private CampaignBroadcast broadcast;