当前位置: 首页 > 面试题库 >

Ebean EmbeddedId映射列到ManyToOne关系

祝宾白
2023-03-14
问题内容

尝试创建组合键(EmbeddedId)时,我遇到了Ebean的问题。

这是我所拥有的草案:

@Entity public class EntityA extends Model{
    @Id
    private String ID;

    @OneToMany
    private List<EntityB> listEntitesB;

    public EntityA(){
        ID = UUID.randomUUID();
    }
}

@Entity public class EntityB extends Model{

    @EmbeddedId
    private EntityB_PK ID;

    @ManyToOne
    @JoinColumn(name="entityA_fk", referencedColumnName="listEntitiesB")
    private EntityA entityA;

    public EntityB(String entityB_ID){
         ID = new EntityB_PK(UUID.randomUUID(), entityB_ID);
    }
}

@Embeddable public class EntityB_PK{
    private String entityB_ID;
    private String entityA_FK_ID;

    public EntityB_PK(String entB_ID, String entA_FK_ID){
       entityB_ID = entB_ID;
       entityA_FK_ID = entA_FK_ID;
    } 
}

注意 :我正在将Ebean 4.1.4与Java 1.6一起使用。

因此,此代码运行良好,但存在一个我正在尝试解决的问题-数据库中的结果表如下所示:

  • entityB_ID [主要]
  • entityA_FK_ID [主要]
  • 实体A_fk

如您所见,考虑到“ entityA_FK_ID”列,最后一列是多余的。

我想要什么?

  • 我希望能够告诉Ebean为关联@ManyToOne使用列“ entityA_FK_ID”,而不是创建它自己的列。

问题答案:

为了解决这个问题,我们必须:

  1. 将EntityB.entityA映射到与EntityB.ID.entityA_FK_ID相同的列
  2. 设置EntityB.entityA @JoinColumn批注的’insertable’和’updateable’属性
  3. EntityB.entityA的替代设置器

这是代码:

EntityA.java:

@Entity 
public class EntityA extends Model {
    @Id
    private String ID;

    @OneToMany(mappedBy="entityA")
    public List<EntityB> listEntitesB;

    public static Finder<String,EntityA> find = new Finder<String,EntityA>(
        String.class, EntityA.class
    );

    public EntityA() {
        ID = UUID.randomUUID().toString();
    }

    public String getID() {
        return ID;
    }
}

EntityB.java:

@Entity 
public class EntityB extends Model {

    @EmbeddedId
    private EntityB_PK ID;

    @ManyToOne
    @JoinColumn(name = "entityA_fk_id", insertable = false, updatable = false)
    private EntityA entityA;

    public EntityA getEntityA() {
        return entityA;
    }

    public void setEntityA(EntityA aEntityA) {
        entityA = aEntityA;
        ID.entityA_FK_ID = aEntityA.getID();
    }

    public EntityB(String entityB_ID){
         ID = new EntityB_PK(UUID.randomUUID().toString(), entityB_ID);
    }

    public String getID() {
        return ID.entityB_ID;
    }
}

EntityB_PK.java:

@Embeddable 
public class EntityB_PK implements Serializable {

    public String entityB_ID;

    @Column(name="entityA_fk_id")
    public String entityA_FK_ID;

    public EntityB_PK(String entB_ID, String entA_FK_ID){
       entityB_ID = entB_ID;
       entityA_FK_ID = entA_FK_ID;
    }

    @Override
    public int hashCode() {
        return entityB_ID.length() + entityA_FK_ID.length();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) 
            return true;
        EntityB_PK b = (EntityB_PK)obj;
        if(b==null)
            return false;
        if (b.entityB_ID.equals(entityB_ID) && b.entityA_FK_ID.equals(entityA_FK_ID)) {
            return true;
        }
        return false;
    }
}


 类似资料:
  • 所以我在网上搜索了我的问题的答案,但没有找到有帮助的东西,基本上是需要在两个类之间有一个ManyToOne关系,其中一个类有一个EmbeddedId,我要把代码留在这里,错误信息是它给(我使用野蝇来运行服务器)。 公共类InventoryPK实现可序列化{ } @实体@Table(name=“inventario”,schema=“mxnextmob”) 公共类库存扩展基本模型{ } 公共类公司扩

  • 问题内容: 我有2个名为PurchaseList.java和PurchaseListItems.java的类 我必须在PurchaseListItems中映射PurchaseList PurchaseList.java PurchaseListItems.java 一切都很好,但我在pl_id中为空。请告诉我我错了 问题答案: 您的映射实际上定义了两个独立的单向关系。您想要的是一个双向关系。下面的

  • 我发现了其他有相同错误的主题,但没有一个似乎涵盖了我的问题。 你能帮我弄清楚是什么问题吗? 多谢!

  • 今天我遇到了这个烦人的bug,花了我几个小时才解决。我在spring boot申请中有以下enity类 入口模型类 和用户模型类 } 如您所见,Entry类与User类具有ManyToOne关系(一个用户有许多条目)。如果从User类中删除单参数构造函数并尝试将Entry对象保存到数据库,则会出现以下错误: JSON分析错误:无法构造的实例(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方

  • 我在Spring Boot JPA应用程序中有以下设置: 可嵌入 原因:org.hibernate.AnnotationException:mappedBy引用了未知的目标实体属性:com.foobar.entity.logSearchHistoryAttr.logSearchHistoryAttrs中的com.foobar.entity.logSearchHistoryAttr.logSearc

  • 我有一个对象带有字段