Я преобразовываю некоторые C# с XML-сопоставлением NHibernate в Java с сопоставлением аннотаций, и есть сущность, которую я пробовал преобразовать без успеха. У нас есть MAIN_TABLE, JOIN_TABLE и THIRD_TABLE. Одна запись из MAIN_TABLE может иметь много от THIRD_TABLE, и их отношение хранится в JOIN_TABLE, который имеет только три столбца: первичный ключ, состоящий из ключей из MAIN_TABLE и THIRD_TABLE, и третья строка с некоторыми нерелевантными дополнительными данными. Это оригинальный NHibernate XML отображение:Сопоставление элементов с составным первичным ключом с аннотациями
<class name="MainTable" table="MAIN_TABLE" mutable="false">
<id name="Id" column="rvcplc" type="int" length="10">
<generator class="assigned"/>
</id>
<bag name="JoinedRecords" table="JOIN_TABLE" order-by="main_table_id">
<key column="main_table_id" not-null="true"/>
<composite-element class="JoinTable">
<parent name="parentRecord"/>
<many-to-one name="ThirdTable" column="third_table_id"/>
</composite-element>
</bag>
И это текущее состояние моего кода:
@Entity()
@Table(name="MAIN_TABLE")
@Immutable
public class MainTable extends BusinessEntity implements IMainTable
{
@Id
@Type(type = "LongToNull")
@Column(name = "id")
private long id;
@ElementCollection
@CollectionTable(name="JOIN_TABLE", joinColumns={@JoinColumn(name="main_table_id")})
private List<IJoinTable> joinedRecords = new ArrayList<IJoinTable>();
}
@Embeddable()
@Table(name = "JOIN_TABLE")
@Immutable
public class JoinTable implements Serializable, IJoinTable
{
@SuppressWarnings("unused")
@Id
private JoinTablePK pkId;
@Parent
@Column(name = "main_table_id")
private IMainTable parentRecord;
@ManyToOne(targetEntity = ThirdTable.class)
@JoinColumn(name = "third_table_id")
private IThirdTable thirdTable;
public static class JoinTablePK implements Serializable
{
// foo
}
}
Когда я пытаюсь модульного тестирования этой ассоциации, просто загружая известную MainTable сущность и утверждая его имеет три дочерних объекта JoinTable в своей коллекции, с ошибкой «Не удалось инициализировать сбор». Это мой лучший код, хотя, поскольку другие попытки сделали ВСЕ мои тесты неудачными, как это происходит, когда у вас неправильное сопоставление.
Прежде всего, спасибо за ваш ответ. К сожалению, «несущественные дополнительные данные» должны быть сопоставлены, потому что это не имеет отношения к отношениям, но содержащиеся в них данные должны использоваться в коде. Поэтому я попробовал свой второй пример и получил «AnnotationException: JoinTable $ JoinTablePK не имеет постоянного свойства id» Любые идеи? – CMPerez
Я знал, что это не сработает, так как это :) Если вы посмотрите на подобные проблемы, у вас есть getters и seters в классе 'JoinTablePK', для' mainTableId' и 'thirdTableId'? –
@Picacodigos Я добавил код 'JoinTablePK' для справки, чтобы иметь полное изображение и полную базу для следующих попыток –