Я думаю, что проблема в том, как вы делаете свое отображение, когда вы пытаетесь втянуть слишком много концепций базы данных в свою модель OO. ORM немного смутил меня, когда я начал это делать. Вам необходимо понять, что концепция поля первичного ключа - это концепция базы данных, а не концепция ОО. В ОО каждая ссылка на объект уникальна, и это то, что вы используете для идентификации экземпляров.
Ссылки на объекты не очень хорошо отображаются в мире баз данных, и поэтому у нас есть свойства первичного ключа. При этом использование свойств первичного ключа должно быть сведено к минимуму. Я считаю полезным минимизировать тип первичного ключа свойства , который отображается непосредственно на первичный ключ столбцы (обычно целочисленные свойства, которые сопоставляются со столбцом первичного ключа).
В любом случае, исходя из этого, вот как я думаю, вы должны сделать свое отображение (изменения выделены горизонтальными разделителями):
С FieldRule.java (дочерний класс):
public class FieldRule implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected FieldRulePK fieldRulePK;
@Basic(optional = false)
@Column(name = "RuleValue")
private String ruleValue;
// Removed field and searchRule mapping as those are already in the
// primary key object, updated setters/getters to pull properties from
// primary key object
public Field getField() {
return fieldRulePK != null ? fieldRulePK.getField() : null;
}
public void getField(Field field) {
// ... parameter validation ...
if (fieldRulePK == null) fieldRulePK = new FieldRulePK();
fieldRulePK.setField(field);
}
public SearchRule getSearchRule() {
return fieldRulePK != null ? fieldRulePK.getSearchRule() : null;
}
public void setSearchRule(SearchRule searchRule) {
// ... parameter validation ...
if (fieldRulePK == null) fieldRulePK = new FieldRulePK();
fieldRulePK.setSearchRule(searchRule);
}
С FieldRulePK.java
(детский класс ПК):
@Embeddable
public class FieldRulePK implements Serializable {
// Map relationships directly to objects instead of using integer primary keys
@JoinColumns({@JoinColumn(name = "IndexTemplateId", referencedColumnName = "IndexTemplateId", insertable = false, updatable = false), @JoinColumn(name = "FieldNumber", referencedColumnName = "FieldNumber", insertable = false, updatable = false)})
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Field field;
@JoinColumn(name = "SearchRuleId", referencedColumnName = "ID", insertable = false, updatable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private SearchRule searchRule;
SearchRule.java
должно быть хорошо, как есть.
Надеюсь, все это имеет смысл.
Обратите внимание, что это не проверено, мне потребуется слишком много времени, чтобы настроить тестовую базу данных и создать весь необходимый тестовый код, но я надеюсь, что это даст вам представление о том, как действовать.