在复合键中使用JoinColumns时,TypeDescriptor错误

ren*_*nke 11 java hibernate jpa

我一直在四处张望,试图弄清楚下面的映射有什么问题.我理解以下映射对于ORM来说并不理想,但这就是数据库的方式,我不能改变它的结构.我正在使用JPA 2.1和Hibernate 5.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;
    }
}
Run Code Online (Sandbox Code Playgroud)
@Table(name = "campaign")
@AttributeOverride(name = "id", column = @Column(name = "campaign_id") )
public class Campaign extends BaseEntity<String> {
    // attributes, getters and setters
}
Run Code Online (Sandbox Code Playgroud)
@Embeddable
public class CampaignBroadcastPK implements Serializable {

    @ManyToOne
    @JoinColumn(name = "campaign_id", insertable = false, updatable = false)
    private Campaign campaign;

    @Column(name = "broadcast_date")
    private LocalDate broadcastDate;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)
@Entity
@Table(name = "campaign_broadcast")
public class CampaignBroadcast implements Serializable {

    @EmbeddedId
    private CampaignBroadcastPK id;

    // attributes, getters and setters
}
Run Code Online (Sandbox Code Playgroud)
@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
}
Run Code Online (Sandbox Code Playgroud)
@Entity
@Table(name = "campaign_broadcast_process")
public class CampaignBroadcastProcess implements Serializable {

    @EmbeddedId
    private CampaignBroadcastProcessPK id;

    // attributes, getters and setters
}
Run Code Online (Sandbox Code Playgroud)

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

当我尝试加载CampaignBroadcastProcessentityManager.find(),hibernate尝试转换campaign_id为Date,即使它被映射为String,导致java.sql.Date抛出一个IllegalStateException,因为传递给的String valueOf不是有效的日期String.

我很怀疑Hibernate正在混合JoinColumns的类型,将CampaignBroadcastProcessPK它们作为LocalDate处理.

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

ren*_*nke 2

我不太清楚为什么,但改变两者的顺序@JoinColum解决了问题。现在的映射如下:

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