Спасибо за Ваш ответ. На самом деле я знаю это. Проблема в том, что мой первичный ключ состоит из нескольких частей, одна из которых является родительской сущностью. Это означает, что существует некоторая ценность, определяющая сущность, но она действительна только в контексте родителя.

ибудь знает, возможно ли установить обратную ссылку из JPA?@EmbeddedId.

Так, например, есть сущность формы

@Entity
public class Entity1 {
    @Id
    @GeneratedValue
    private String identifier;

    private Entity1 relationToEntity1;
    //Left out the getters and setters for simplicity
}

И вторая сущность со сложным встроенным идентификатором. Одна часть этого второго объекта является ссылкой на его родительский объект. Вот так:

@Entity
public class Entity2 {
    @EmbeddedId private Entity2Identifier id;
    //Left out the getters and setters for simplicity.
}

@Embedabble
public class Entity2Identifier {
    private String firstPartOfIdentifier;
    private Entity1 parent;
    //Left out the getters and setters for simplicity.
}

Когда я пытаюсь сохранить такую ​​конструкцию через JPA (реализация - EclipseLink) в базе данных, я получаю несколько исключений из формы:

<pre><code>Exception [EclipseLink-93] (Eclipse Persistence Services - 1.1.0.r3639-SNAPSHOT): org.eclipse.persistence.exceptions.DescriptorException Exception Description: The table [ENTITY1] is not present in this descriptor. Descriptor: RelationalDescriptor(test.Entity2 --> [DatabaseTable(ENTITY2)]) </code></pre>

Кто-то сталкивался с такой проблемой и имеет решение?

Ответы на вопрос(2)

Решение Вопроса

что вы ищете, является производным идентификатором. Если вы используете JPA 2.0, то будет работать следующее. Вы действительно не хотите, чтобы весь Родитель был частью ПК, просто ПК Родителя.

@Entity
public class Entity1 {
    @EmbeddedId
    private ParentId identifier;

    @OneToOne(mappedBy="relationToEntity1")
    private Entity2 relationToEntity2;

    //Left out the getters and setters for simplicity
}

@Entity
public class Entity2 {
    @EmbeddedId private Entity2Identifier id;
    //Left out the getters and setters for simplicity.

    @MapsId("parentId")
    @OneToOne
    private Entity1 parent;

}

@Embedabble
public class Entity2Identifier {
    private String firstPartOfIdentifier;
    private ParentId parentId;
    //Left out the getters and setters for simplicity.
}
 ali15 янв. 2011 г., 22:56
ХОРОШО. Я думаю, мой пример был простым. Родитель на самом деле имеет сложный встроенный идентификатор, также состоящий из двух строк. Вот почему я не могу просто ссылаться на его ID.
 Gordon Yorke18 янв. 2011 г., 21:48
Это тоже просто. Я обновил мой пример выше, чтобы использовать EmbeddedId для Entity 1.
 Tom Anderson25 авг. 2011 г., 20:44
@MapsId - победитель! Так полезно.

@EmbeddedId аннотация не допускает отношений в классе составных идентификаторов. ИзEmbeddedId JavaDoc:

Отображения отношений, определенные во встроенном классе идентификаторов, не поддерживаются.

Я понимаю что ты хочешьEntity2Identifier чтобы содержать ключ к родителю, но в вашем примере вы создаете связь со всем объектом, а не просто включаете первичный ключ родителя. Даже если бы эта конструкция работала, вы бы установили составной ключ, который будет не только первичным ключом родителя, но и целым состоянием родителя.

Если вы просто ищете простой способ установить двунаправленные отношения, вы можете сделать это с помощью@OneToOne аннотация иmappedBy атрибут:

@Entity
public class Entity1 {
    @Id
    @GeneratedValue
    private String identifier;

    @OneToOne(mappedBy="relationToEntity1")
    private Entity2 relationToEntity2;
    ...
}

@Entity
public class Entity2 {

    @OneToOne
    private Entity1 relationToEntity1;
    ...
}

С этим набором аннотаций поставщик JPA будет обрабатыватьEntity1.relationToEntity2 а такжеEntity2.relationToEntity1 правильно как двунаправленные отношения. Вы также можете переопределить стандартное поведение каскада (нет), а также стандартное поведение удаления сирот (нет). УвидетьJavaDoc Больше подробностей.

 ali10 янв. 2011 г., 06:43
Спасибо за Ваш ответ. На самом деле я знаю это. Проблема в том, что мой первичный ключ состоит из нескольких частей, одна из которых является родительской сущностью. Это означает, что существует некоторая ценность, определяющая сущность, но она действительна только в контексте родителя.

Ваш ответ на вопрос