CREATE TABLE Template (
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
-- omitted
);
CREATE TABLE TemplateLabel (
template_id UUID REFERENCES Template(id) ON DELETE CASCADE,
code TEXT NOT NULL,
-- omitted
PRIMARY KEY (template_id, code)
);
< /code>
Шаблон имеет отношение к одно-кому с TemplateLabel. TemplateLabel использует Template.id и код в качестве составного первичного ключа. .java: < /p>
@Entity
public class Template {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;
@OneToMany(mappedBy = "template", cascade = CascadeType.ALL, orphanRemoval = true)
private List labels;
}
< /code>
templateLabel.java:
написан@Entity
public class TemplateLabel {
@EmbeddedId
private TemplateLabelId id;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("templateId")
@JoinColumn(name = "template_id")
private Template template;
}
< /code>
templateLabelid.java:
@Embeddable
public class TemplateLabelId {
@Column(name = "template_id")
private UUID templateId;
private String code;
}
< /code>
шаблон сохранения < /h4>
Я строит шаблон и предварительно заполняйте его всеми его метками, устанавливая все, кроме Template.id и TemplateLabel.id. Шаблон, который должен иметь одинаковое значение при вставке в дБ.Template template = Template.builder()
// all the fields except for id and labels
.build();
List labels = dto.getLabels().stream().map(label ->
TemplateLabel.builder()
.id(new TemplateLabelId(null, label.getCode()))
.template(template)
// other fields
.build()
).toList();
template.setLabels(labels);
templateRepository.save(template);
< /code>
проблема < /h4>
Я хотел бы генерировать идентификаторы из базы данных, а не из кода, и предпочтительно настроить объекты таким образом, чтобы, чтобы, чтобы, чтобы, чтобы, чтобы Я могу вставить шаблон и некоторые метки шаблонов в базу данных только с одним вызовом на repository.save. < /P>
Другими словами, я хотел бы создать объект шаблона с id = null и предварительно заполнить его некоторыми метками (каждая с id.templateid = null), и просто вызовет репозиторий. Repository.ave Сначала с шаблоном для получения идентификатора, сгенерированного DB, а затем Manully присвоил этот идентификатор всем этикеткам, а затем вызовите репозиторий. Опять же. Не может установить java.util.uuid field my.project.entity.templateLabelid.templateid to org.hibernate.id.identifiergeneratorHelper $ 1
Я видел то же исключение, которое обсуждалось в другом посте, но решение было использовать @embeddedid
, Что я уже использую, поэтому мне интересно, что еще мне следует изменить в своих сущностях. Если Поле шаблона в моем классе TemplateLabel необходимо.
Однонаправленное связывание, вероятно, предпочтительнее, так как никогда не будет случая, когда я сам остановил бы этикетку, но я не уверен, смогу ли я достичь одного хранилища. Сохраните то, что я объяснил выше без него. Я также хотел бы удалить его и просто использовать Uuid, если смогу, чтобы все было просто. Но это более незначительная проблема (и кажется, что это тоже может быть менее эффективным?).
CREATE TABLE TemplateLabel ( template_id UUID REFERENCES Template(id) ON DELETE CASCADE, code TEXT NOT NULL, -- omitted
PRIMARY KEY (template_id, code) ); < /code> Шаблон имеет отношение к одно-кому с TemplateLabel. TemplateLabel использует Template.id и код в качестве составного первичного ключа. .java: < /p> @Entity public class Template { @Id @GeneratedValue(strategy = GenerationType.UUID) private UUID id;
@OneToMany(mappedBy = "template", cascade = CascadeType.ALL, orphanRemoval = true) private List labels; } < /code> templateLabel.java: написан@Entity public class TemplateLabel { @EmbeddedId private TemplateLabelId id;
private String code; } < /code> шаблон сохранения < /h4> Я строит шаблон и предварительно заполняйте его всеми его метками, устанавливая все, кроме Template.id и TemplateLabel.id. Шаблон, который должен иметь одинаковое значение при вставке в дБ.Template template = Template.builder() // all the fields except for id and labels .build(); List labels = dto.getLabels().stream().map(label -> TemplateLabel.builder() .id(new TemplateLabelId(null, label.getCode())) .template(template) // other fields .build() ).toList(); template.setLabels(labels); templateRepository.save(template); < /code> проблема < /h4> Я хотел бы генерировать идентификаторы из базы данных, а не из кода, и предпочтительно настроить объекты таким образом, чтобы, чтобы, чтобы, чтобы, чтобы, чтобы Я могу вставить шаблон и некоторые метки шаблонов в базу данных только с одним вызовом на repository.save. < /P> Другими словами, я хотел бы создать объект шаблона с id = null и предварительно заполнить его некоторыми метками (каждая с id.templateid = null), и просто вызовет репозиторий. Repository.ave Сначала с шаблоном для получения идентификатора, сгенерированного DB, а затем Manully присвоил этот идентификатор всем этикеткам, а затем вызовите репозиторий. Опять же. Не может установить java.util.uuid field my.project.entity.templateLabelid.templateid to org.hibernate.id.identifiergeneratorHelper $ 1
Я видел то же исключение, которое обсуждалось в другом посте, но решение было использовать @embeddedid [/code], Что я уже использую, поэтому мне интересно, что еще мне следует изменить в своих сущностях. Если Поле шаблона в моем классе TemplateLabel необходимо. Однонаправленное связывание, вероятно, предпочтительнее, так как никогда не будет случая, когда я сам остановил бы этикетку, но я не уверен, смогу ли я достичь одного хранилища. Сохраните то, что я объяснил выше без него. Я также хотел бы удалить его и просто использовать Uuid, если смогу, чтобы все было просто. Но это более незначительная проблема (и кажется, что это тоже может быть менее эффективным?).
Почему этот столбец не найден (SQL Exception) при выполнении последнего запроса в репо (выберите Студент по ключам Forign Department_ID)
Clact Class
package com.global.student.entity;