当前位置: 首页 > 知识库问答 >
问题:

jpa实体复合键错误

魏安宁
2023-03-14
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;
}
}

异常[EclipseLink-48](Eclipse Persistence Services-2.3.2.v20111125-r10461):org.Eclipse.Persistence.exceptions.Description异常描述:字段[flight.connid]存在多个可写映射。只有一个可以定义为可写,所有其他的都必须指定为只读。映射: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.Description异常描述:字段[flight.carrid]存在多个可写映射。只有一个可以定义为可写,所有其他的都必须指定为只读。映射: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)

由:Exception[EclipseLink-0](Eclipse Persistence Services-2.3.2.v20111125-r10461):org.Eclipse.Persistence.exceptions.IntegrityException引起

请告知哪里出了问题。我已经尝试了每一件事,但都没有成功。

你好,斯拉维克。

共有1个答案

黄弘盛
2023-03-14

发生此错误是因为您有多个属性映射相同的列。你的模特看起来很困惑。如果连接和承运人是唯一的,那么为什么预订需要另一个ID?或者一个航班怎么能有一个单独的预订?

就我个人而言,我不建议使用EmbeddedId,而建议使用IdClass,并在您的关系中使用@id。您还可以在联接列上使用insertable/updateable=false,但您的模型似乎很奇怪。

看,

 类似资料:
  • 我有一个实体,它的复合主键由两个字段组成,其中一个也是复合外键的一部分。 背景:我有实体<代码>人员 、<代码>区域 和<代码>会话 。 与具有多对多关系,使用称为“和实体。 所以,我有,主键为(,)。本身是的外键。 也有一个字段。我希望(,)是的复合外键。 我的PersonSession代码: } 这看起来不错,它在数据库中创建了所有正确的关系。当我尝试插入个性化会话对象时,问题就出现了——ar

  • 我在表EmployeeCode的两列上有一个主键 主键(ecode,eid) 列eid是一个外键,它引用表Employee并具有ManytoOne映射,我已经在EmployeeCode.java中声明了如下内容 当我这样做时,我得到以下异常,因为我在这两个位置都使用了EID(因为它是另一个表的外键,也是复合主键的一部分) 我怎么能在两个地方都用同一个名字呢?

  • 问题内容: 我的JPA模型中有以下类(省略了getters,setters和无关字段): 我需要定义一个类,使得当从所述类生成DDL时,相应的表的主键被由密钥和。我尝试了以下方法: 但这会为表生成以下内容: 请注意,和都是可为空的,当我尝试将DDL加载到SQL Server时会导致以下错误 无法在表“ PRICE”中的可为空的列上定义PRIMARY KEY约束 我不明白为什么这些可以为空,因为在域

  • 我有一个JPA实体的类层次结构,基类是定义了一个ID的MappedSuperclass。我试图在子类中使用复合键,但这似乎不起作用

  • 问题内容: 是否可以在普通的JPA或JPA + Hibernate扩展中声明复合键,而复合键的元素是一个序列? 这是我的复合课程: 我已经提供的值,,和。我想构造一个像下面这样的实体: 当我调用)时,我希望生成并插入集成。 这可能吗?如果是这样,简单的方法是什么?(我不想使用应用程序提供的密钥或本机sql)。 问题答案: 我相信使用普通的JPA是不可能的。

  • 本文向大家介绍Spring Data Jpa 复合主键的实现,包括了Spring Data Jpa 复合主键的实现的使用技巧和注意事项,需要的朋友参考一下 前言 这次大创有个需求,在数据库建表时发现,user表与project表的关系表 user_project的主键为复合主键: 在网上看了几篇博客,以及在spring boot干货群咨询(感谢夜升额耐心解答)过后总算是做出来了。这里做个总结,方便