2010-05-27 2 views
1

Я уже много лет борется с этим. Оказывается, гораздо меньше простой, чем я думал, что это будет:от Hibernate hbm до JPA аннотаций, сложный

<join table="COTISATION_SYNCHRO" fetch="join" optional="true"> 
     <key column="COTISATION_SYNCHRO_COTISATION_ID_FK" on-delete="noaction"/> 
     <property name="cotisationCoupon" type="java.lang.Long" update="true" insert="true"> 
      <column name="COTISATION_COUPON" not-null="true" unique="true"/> 
     </property> 
     <property name="synchroData" type="com.allence.opcapl.alpha2.common.model.synchro.SynchroDataType"> 
      <column name="LAST_ACCESS_LOCAL" not-null="true"/> 
      <column name="LAST_UPDATE_LOCAL" not-null="true"/> 
      <column name="LAST_ACCESS_REMOTE" not-null="true"/> 
      <column name="LAST_UPDATE_REMOTE" not-null="true"/> 
     </property> 
    </join> 

Это входит в отображении COTISATION таблицы и использует SynchroDataType, расширяя Hibernate UserType.

Это действительно замечательно, но я не могу найти способ перевести его в надлежащую JPA, сохраняя при этом удобство.

У кого-то есть решение для такого рода взаимно однозначного отображения?

ответ

1

Посмотрите на @Embedded аннотацию, чтобы решить не-сущность объекта SynchroDataType и @SecondaryTable для обработки отображения на один-к-одному между COTISATION и COTISATION_SYNCHRO.

+0

Не забудьте @Embeddable на сам класс не-сущности. – qualidafial

0

спасибо большое, я получил его работу. Я сосредоточился на @JoinTable, неправильном направлении. @secondaryTable сделал трюк.

вот решение:

@Entity 
@Table(name = "COTISATION") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
@SecondaryTable(name = "COTISATION_SYNCHRO", pkJoinColumns = @PrimaryKeyJoinColumn(name = "COTISATION_SYNCHRO_COTISATION_ID_FK")) 
public class Cotisation { 
... 

@Embedded 
@AttributeOverrides({ 
     @AttributeOverride(name = "lastAccessLocal", column = @Column(name = "LAST_ACCESS_LOCAL", table = "COTISATION_SYNCHRO")), 
     @AttributeOverride(name = "lastUpdateLocal", column = @Column(name = "LAST_UPDATE_LOCAL", table = "COTISATION_SYNCHRO")), 
     @AttributeOverride(name = "lastAccessRemote", column = @Column(name = "LAST_ACCESS_REMOTE", table = "COTISATION_SYNCHRO")), 
     @AttributeOverride(name = "lastUpdateRemote", column = @Column(name = "LAST_UPDATE_REMOTE", table = "COTISATION_SYNCHRO")) 
}) 
private SynchroData synchroData; 

@Column(name = "COTISATION_COUPON", table = "COTISATION_SYNCHRO", unique = true) 
private Long cotisationCoupon; 

с классом SynchroData аннотацию @Embeddable

Смежные вопросы