JPA не добавляет идентификатор в базу данных из объекта обтекания - PullRequest
2 голосов
/ 22 декабря 2011

Используя JPA, у меня есть конфигурация данных, которая без проблем добавляется в базу данных:

   @Entity @Table(name = "dataConfigurations", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"})})
    @NamedQueries({@NamedQuery(name = "DataConfigurations.names", query = "SELECT d.name FROM DataConfiguration d"), @NamedQuery(name = "DataConfiguration.findByName", query = "SELECT d FROM DataConfiguration d WHERE d.name = :name")})
    public class DataConfiguration implements Serializable
    {

        @Transient
        private static final long serialVersionUID = 1L;
        @Id //@GeneratedValue(strategy = GenerationType.)
            //@TableGenerator(name = "dataConfigurationSequence", table = "Sequences", pkColumnName = "NameSequences", valueColumnName = "valueSequence", pkColumnValue = "dataConfigurationId")
        private long id;
        @OneToMany(mappedBy = "dataConfiguration", cascade = CascadeType.ALL)
        private List<Content> contents; // "Data" is a reserved SQL word.
        @ManyToMany(mappedBy = "dataConfigurations", cascade = CascadeType.ALL)
        private List<LabelType> labelTypes;
        private String name;
        @OneToMany(mappedBy = "dataConfiguration", cascade = CascadeType.ALL
        private List<Template> templates;

Эта конфигурация данных содержит список содержимого (отношение один ко многим), другие сопоставления (шаблоны en labelTypes)пока не имеет значения, но будет позже в моей программе, они, вероятно, вызовут ту же проблему, что и я с содержимым)

@Entity @Table(name = "contents", uniqueConstraints = {@UniqueConstraint(columnNames = {"dataConfigurationId", "displayOrder"})})
    public class Content implements Serializable
    {
        @Transient
        private static transient final long serialVersionUID = 1L;
        @Id //@GeneratedValue(strategy = GenerationType.IDENTITY)
            //@TableGenerator(name = "contentSequence", table = "Sequences", pkColumnName = "NameSequences", valueColumnName = "valueSequence", pkColumnValue = "contentId")
        private long id;
        private String content; // "Data" is a reserved word in traditional SQL.
            @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "dataConfigurationId")
        private DataConfiguration dataConfiguration;
        private int displayOrder;
        private int editableFrom;
        private String typeDiscriminator;

Это метод контроллера, который инициирует метод сохранения:

public String saveDataConfiguration()
{
    dataConfiguration = new DataConfiguration(getNextId(), dataConfigurationName, contents);
    dataConfigurationFacade.create(dataConfiguration);
    return null;
}

Метод create является частью AbstractFacade

public void create(T entity)
{
    getEntityManager().persist(entity);
        getEntityManager().flush();
}

Когда я выполняю метод, все, кроме Id конфигурации данных в таблице содержимого, сохраняется.(Внешний ключ конфигурации данных не сохраняется в содержимом). Любые советы и / или советы будут очень полезны!

1 Ответ

1 голос
/ 22 декабря 2011

Возможно, вы забыли инициализировать поле dataConfiguration каждого контента. Это тот, который сопоставлен со столбцом соединения, и именно поэтому Hibernate проверяет, есть ли связь между двумя сущностями или нет.

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