2014-03-03 3 views
0

저는 Play2에서 EBean을 사용하여 다 대다 관계를 만들려고하고 있습니다. EBean이 내 클래스가 등록되지 않았다는 오류를 발생시키는 문제가 있습니다. Heres는 내 매핑 클래스 :JPA와 EBean의 Many to Many

@Entity 
public class Booking extends Model { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    //... other fields 
} 
@Entity 
public class Store extends Model { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    //... other fields 
} 

@Embeddable 
public class ComissionId { 
    @ManyToOne(targetEntity = Booking.class, optional = false) 
    @PrimaryKeyJoinColumn(name = "booking_id", referencedColumnName = "id") 
    private Booking booking; 

    @ManyToOne(targetEntity = Store.class, optional = false) 
    @PrimaryKeyJoinColumn(name = "store_id", referencedColumnName = "id") 
    private Store store; 
} 

@Entity 
@AssociationOverrides({ 
    @AssociationOverride(name = "id.booking", joinColumns = @JoinColumn(name = "booking_id")), 
    @AssociationOverride(name = "id.store", joinColumns = @JoinColumn(name = "store_id")) 
}) 
public class StoreComission extends Model { 
    @EmbeddedId 
    private ComissionId id; 
    @Column(nullable = false) 
    private double value; 
    @Column(nullable = false) 
    private Date date; 
} 

오류 : 내 application.conf에서

java.lang.RuntimeException: 
    Error reading annotations for models.ids.ComissionId 
    Caused by: java.lang.RuntimeException: 
    Error with association to [class models.Booking] from [models.ids.ComissionId.booking]. 
    Is class models.Booking registered? 

나는 ebean.default = 넣었습니다 그래서이 모든 클래스가 바로 등록해야 "모델 *."? (패키지 모델 .ids에서 모델로 ComissionId를 이동하려고 시도했지만 동일한 오류가 발생했습니다.)

답변

0

ComissionId 클래스의 @ManyToOne 주석 때문에이 오류가 발생했습니다. 이 코드를 작동 시키려면 이러한 관계를 StoreComission 클래스로 이동해야합니다. ComissionId 클래스에서는 식별자 만 남겨 두어야합니다. StoreComission 클래스에서 @ManyToOne 관계는 복합 키의 필드와 동일한 열에 매핑됩니다. 그러나 열 중복을 방지하기 위해 'insertable'및 'updateable'속성을 false로 설정했습니다.

StoreComission 클래스 :

@Entity 
public class StoreComission extends Model { 

    public StoreComission() { 
     id = new ComissionId(); 
    } 

    @EmbeddedId 
    private ComissionId id; 

    @Column(nullable = false) 
    public double value; 

    @Column(nullable = false) 
    public Date date; 

    @ManyToOne 
    @JoinColumn(name = "booking_id", insertable = false, updatable = false) 
    private Booking booking; 

    @ManyToOne 
    @JoinColumn(name = "store_id", insertable = false, updatable = false) 
    private Store store; 

    public void setBooking(Booking aBooking) { 
     booking = aBooking; 
     id.booking_id = aBooking.id; 
    } 

    public Booking getBooking() { 
     return booking; 
    } 

    public void setStore(Store aStore) { 
     store = aStore; 
     id.store_id = aStore.id; 
    } 

    public Store getStore() { 
     return store; 
    } 
} 

ComissionId 클래스 :

@Embeddable 
public class ComissionId { 

    public int booking_id; 

    public int store_id; 

    @Override 
    public int hashCode() { 
     return booking_id + store_id; 
    } 

    @Override 
    public boolean equals(final Object obj) { 
     return super.equals(obj); 
    } 
} 
여기
는 위의 시나리오에 대한 작동 코드를 수정한다