0

JPA の問題であなたの助けが必要です。次のエンティティと主複合キーを見てください。

@Embeddable public class BookingPK implements Serializable { private static final long serialVersionUID = 1L;

private String carrid;
private String connid;
private String bookid;


public String getcarrid()
{
    return this.carrid;
}

public void setcarrid(String carrid)
{
    this.carrid = carrid;
}

public String getconnid()
{
    return this.connid;
}

public void setconnid(String connid)
{
    this.connid = connid;
}

public String getbookid()
{
    return this.bookid;
}

public void setbookid(String bookid)
{
    this.bookid = bookid;
}

 public int hashCode() 
 {
    return (int) ( this.carrid.hashCode())
            +(int) ( this.connid.hashCode())
            +(int) ( this.bookid.hashCode());

 }

 public boolean equals(Object obj) 
 {
    if (obj == this) return true;
    if (!(obj instanceof Booking)) return false;
    BookingPK pk = (BookingPK) obj;
    return  pk.carrid.equals(this.carrid)
            && pk.connid.equals(this.connid)
            && pk.bookid.equals(this.bookid);
 }



@Entity
public class Booking 
{
@EmbeddedId
private BookingPK bookingPrimaryKey;
private String CANCELLED;


public BookingPK getbookingPrimaryKey()
{
    return this.bookingPrimaryKey;
}

public void setbookingPrimaryKey(BookingPK key)
{
    this.bookingPrimaryKey = key;
}

public String getCANCELLED()
{
    return this.CANCELLED;
}

public void setCANCELLED(String CANCELLED)
{
    this.CANCELLED = CANCELLED;
}
}



@Embeddable
public class FlightPK implements Serializable 
{
private static final long serialVersionUID = 1L;

private String carrid;
private String connid;


public String getcarrid()
{
    return this.carrid;
}

public void setcarrid(String carrid)
{
    this.carrid = carrid;
}

public String getconnid()
{
    return this.connid;
}

public void setconnid(String connid)
{
    this.connid = connid;
}

  public int hashCode() 
  {
    return (int) ( this.carrid.hashCode())
            +(int) ( this.connid.hashCode());
  }

  public boolean equals(Object obj) 
  {
    if (obj == this) return true;
    if (!(obj instanceof Flight)) return false;
    FlightPK pk = (FlightPK) obj;
    return  pk.carrid.equals(this.carrid)
            && pk.connid.equals(this.connid);
 }
}



@Entity
public class Flight 
{
@EmbeddedId
private FlightPK flightPrimaryKey; 

private Booking bookedFlight;


public Booking getbookedFlight()
{
    return this.bookedFlight;
}

public void setbookedFlight(Booking flight)
{
    this.bookedFlight = flight;
}

public FlightPK getflightPrimaryKey()
{
    return this.flightPrimaryKey;
}

public void setPRICE(FlightPK key)
{
    this.flightPrimaryKey = key;
}
}

アプリケーションを実行して DB テーブルを作成すると、次の例外が発生します。

スレッド「メイン」の例外 javax.persistence.PersistenceException: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.IntegrityException

記述子の例外:

例外 [EclipseLink-48] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException 例外の説明: フィールド [FLIGHT.CONNID] に対して複数の書き込み可能なマッピングが存在します。書き込み可能として定義できるのは 1 つだけで、その他はすべて読み取り専用として指定する必要があります。マッピング: org.eclipse.persistence.mappings.OneToOneMapping[bookedFlight] 記述子: RelationalDescriptor(testik.Flight --> [DatabaseTable(FLIGHT)])

例外 [EclipseLink-48] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException 例外の説明: フィールド [FLIGHT.CARRID] に対して複数の書き込み可能なマッピングが存在します。書き込み可能として定義できるのは 1 つだけで、その他はすべて読み取り専用として指定する必要があります。マッピング: org.eclipse.persistence.mappings.OneToOneMapping[bookedFlight] 記述子: RelationalDescriptor(testik.Flight --> [DatabaseTable(FLIGHT)])

ランタイム例外:

at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:517)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:188)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getMetamodel(EntityManagerFactoryDelegate.java:591)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getMetamodel(EntityManagerFactoryImpl.java:506)
at org.odata4j.producer.jpa.JPAEdmGenerator.generateEdm(JPAEdmGenerator.java:95)
at org.odata4j.producer.jpa.JPAProducer.<init>(JPAProducer.java:91)
at com.mockservice.MockService.<init>(MockService.java:34)
at com.mockservice.MockService.main(MockService.java:51)

原因: 例外 [EclipseLink-0] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.IntegrityException

記述子の例外:

何が間違っているかアドバイスしてください。私はすでにあらゆることを試しましたが、成功しませんでした。

よろしく、スラヴィク。

4

1 に答える 1

0

同じ列をマッピングする複数の属性があるため、エラーが発生します。あなたのモデルは非常に混乱しているようです。接続とキャリアが一意である場合、予約に別の ID が必要なのはなぜですか? または、どのようにしてフライトに 1 つの一意の予約を含めることができるでしょうか?

個人的には、EmbeddedId を使用することはお勧めしませんが、代わりに IdClass を使用し、関係に @Id を使用します。結合列で insertable/updateable=false を使用することもできますが、モデルが奇妙に見えます。

見る、

http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0

于 2013-01-03T14:27:04.537 に答える