Используете JPA, сопоставленное с полем не первичного ключа? - PullRequest
0 голосов
/ 30 августа 2010

У меня проблемы с получением этой работы, и мне интересно, если то, что я делаю, просто не имеет смысла?

public class Application {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private long id;
    ....
}

@MappedSuperclass
public abstract class Sample {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToOne (cascade=CascadeType.ALL)
    protected Application application;
    ....
}

// TestSample contains a list that is mapped not by the primary key of the Sample
public class TestSample extends Sample {
    @OneToMany(mappedBy="application", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<Part> parts = new ArrayList<Part>();
    ....
}

public class Part {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private long id = 0;

    @ManyToOne (cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    Application application;
}

У меня проблема в том, что я могу добавлять детали, база данных выглядитправильно, тогда, когда я пытаюсь получить список parts, я получаю пустой список.

Я могу заставить его работать, если скомпрометирую структуру базы данных, изменив эти классы:

// TestSample contains a list that is mapped not by the primary key of the Sample
public class TestSample extends Sample {
    @OneToMany(mappedBy="testSample", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private List<Part> parts = new ArrayList<Part>();
    ....
}

public class Part {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private long id = 0;

    @ManyToOne (cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    TestSample testSample;
}

Таблицы автоматически генерируются hibernate, поэтому они выглядят так:

application
  id : number
  ....

test_sample
  id : number
  application_id : number
  ...

part
  id : number
  application_id : number

Если я изменю его на менее желательный способ работы, последняя таблица будет другой:

part
  id : number
  test_sample_id : number

Поскольку идентификаторы во всех случаях генерируются автоматически, общих первичных ключей не существует.По сути, я пытаюсь использовать mappedby, где mappedby ссылается на поле, которое не является первичным ключом таблицы / класса с именем «TestSample».Это то, что я не уверен, имеет ли смысл в JPA.

1 Ответ

0 голосов
/ 30 августа 2010

OneToMany является двунаправленным с классом "Part".Я думаю, что это становится очень трудно объяснить (:

Ваша связь один-ко-многим между TestSample и Part равна , а не двунаправленная, mappedBy - этоне правильно (таблица application не владеет отношением, она даже не знает test_sample), ваше отображение не имеет смысла. Есть что-то, что нужно изменить.

Я думаю, что вы должны показать, что представляют собой ожидаемые таблицы, а не сгенерированные (поскольку сопоставления не согласованы, сгенерированный результат не может быть удовлетворительным). Вы говорите о компромиссе, поэтому я считаю, чтоиметь представление о том, каким должен быть ожидаемый результат. Пожалуйста, покажите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...