TransientObjectException при сохранении ссылок на объекты в HibernateJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 TransientObjectException при сохранении ссылок на объекты в Hibernate

Сообщение Anonymous »

Я сталкиваюсь с TransientObjectException при попытке создать и сохранить объект Activity, который ссылается на объект Methodology через таблицу соединений ActivityMethodology. Несмотря на то, что объект методологии найден в базе данных и управляется, я все равно сталкиваюсь со следующей ошибкой при попытке сохранить связь:
org.hibernate.TransientObjectException: объект ссылается на несохраненный переходный процесс экземпляр — сохраните временный экземпляр перед очисткой: com.unfccc.activityservice.entity.Methodology
Сущности
Вот упрощенная версия моих отношений сущностей:
1.)Активность: содержит множество сущностей методологии через объединяющую таблицу.
2.)Методология: простая сущность, которая может существовать независимо и должна быть связана с действиями.
3.)ActivityMethodology : объект объединяющей таблицы, который соединяет действие и методологию с помощью составного ключа.
Что я пробовал
Проверка управляемости методологии: прежде чем связать ее с действием, я проверяю если методология уже существует в базе данных, и убедитесь, что она управляется EntityManager.
Сохранение или слияние: в зависимости от того, существует ли методология, я либо сохраняю ее, либо объединяю, чтобы гарантировать ее в управляемом состоянии.
Сброс и обновление: я добавил явные вызовы флеш() и обновления() после сохранения или слияния, чтобы гарантировать синхронизацию состояния с базой данных.
Сброс и обновление. p>
Несмотря на это, я все равно получаю исключение TransientObjectException.
List activityMethodologies = new ArrayList();
if (activity.getMethodology() != null && !activity.getMethodology().isEmpty()) {
for (Methodology methodology : activity.getMethodology()) {
// Check if the Methodology already exists
Methodology existingMethodology = methodologyService.findByMethodologyName(methodology.getMethodologyName());

if (existingMethodology == null) {
// Persist new Methodology
log.info("Persisting new methodology...");
entityManager.persist(methodology);
entityManager.flush(); // Ensure it's saved in the DB
existingMethodology = methodology;
} else {
log.info("Methodology is already managed.");
}

log.info("Methodology is now managed with ID: " + existingMethodology.getMethodologyId());

// Create ActivityMethodology link
ActivityMethodology activityMethodology = new ActivityMethodology();
ActivityMethodologyId id = new ActivityMethodologyId(activity.getActivityNumber(), existingMethodology.getMethodologyId());
activityMethodology.setId(id);
activityMethodology.setActivity(activity);
activityMethodology.setMethodology(existingMethodology);

log.info("Persisting ActivityMethodology...");
activityMethodologyService.saveActivityMethodology(activityMethodology);
}
}

Журналы
Вот журнал, показывающий, что идентификатор методологии получен правильно, но затем возникает ошибка.
24 октября 2024 г. 14:08:38.043 INFO Существующая методология найдена с идентификатором: d2fd8cbf-8af6-44d9-b349-1f75dc7f1e3c
2024-10-24 14:08:38.044 INFO Методология уже управляется.
2024-10-24 14:08:38.100 ОШИБКА Ошибка создания действия
org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед очисткой: com.unfccc.activityservice.entity.Methodology
Мой вопрос
Почему я все еще получаю исключение TransientObjectException, хотя гарантирую, что методология управляется EntityManager?
Как устранить эту ошибку и правильно сохранить ее? связь между активностью и методологией через ActivityMethodology?
Изменить: 25.10.2024: это метод, в котором я сохраняю активность
/**
* Saves or updates an activity.
*
* @param activity The activity to save or update.
* @return The saved or updated activity.
*/
@Transactional
@Override
public Activity saveActivity(Activity activity) {
return activityRepository.save(activity);
}

/**
* Creates a new activity with associated entities and relationships.
*
* @param activityNumber The unique number identifying the activity.
* @param activity The activity object to be created.
* @return The created and persisted activity.
*/
@Override
public Activity createActivity(String activityNumber, Activity activity) {
// Check if an activity with the given activityNumber already exists
Activity existingActivityOpt = findByActivityNumber(activityNumber);
if (existingActivityOpt != null) {
throw new IllegalArgumentException("Activity with number " + activityNumber + " already exists.");
}

// Validate that activityNumber is not null or empty
if (activityNumber == null || activityNumber.isEmpty()) {
throw new IllegalArgumentException("Activity number is required, cannot be null or empty.");
}

activity.setActivityNumber(activityNumber);

// Initialize empty lists for related entities if they are null
if (activity.getActivityHostParties() == null) {
activity.setActivityHostParties(new ArrayList());
}
if (activity.getInvoices() == null) {
activity.setInvoices(new ArrayList());
}
if (activity.getFocalPoints() == null) {
activity.setFocalPoints(new ArrayList());
}

// Link CPAs (sub-activities) to the Activity
if (!activity.getCpas().isEmpty()) {
List linkedCpas = new ArrayList();
for (CPA cpa : activity.getCpas()) {
CPA existingCpa = cpaService.findCPAByTitle(cpa.getTitle());
if (existingCpa != null) {
// If CPA exists, associate it with the current activity
existingCpa.setActivity(activity);
linkedCpas.add(existingCpa);
} else {
// Otherwise, create a new CPA linked to the activity
cpa.setActivity(activity);
linkedCpas.add(cpa);
}
}
activity.setCpas(linkedCpas);
}

// Link Host Parties to the Activity
if (!activity.getActivityHostParties().isEmpty()) {
List linkedHostParties = new ArrayList();
for (ActivityHostParty hostParty : activity.getActivityHostParties()) {
ActivityHostParty existingHostParty = activityHostPartyService.findById(hostParty.getHostPartyId());
if (existingHostParty != null) {
linkedHostParties.add(existingHostParty);
} else {
throw new IllegalArgumentException("Invalid Host Party ID: " + hostParty.getHostPartyId());
}
}
activity.setActivityHostParties(linkedHostParties);
}

// Link Methodologies to the Activity
List activityMethodologies = new ArrayList();
if (activity.getMethodology() != null && !activity.getMethodology().isEmpty()) {
for (Methodology methodology : activity.getMethodology()) {
// Check if the Methodology already exists by its name
Methodology existingMethodology = methodologyService.findByMethodologyName(methodology.getMethodologyName());

if (existingMethodology == null) {
existingMethodology = methodologyService.createMethodology(methodology);
// Persist new Methodology if it does not exist
entityManager.persist(methodology);
entityManager.flush(); // Ensure it is saved in the DB immediately
existingMethodology = methodology;
}

// Create link entity ActivityMethodology to associate Activity with Methodology
ActivityMethodology activityMethodology = new ActivityMethodology();
ActivityMethodologyId id = new ActivityMethodologyId(activity.getActivityNumber(), existingMethodology.getMethodologyId());
activityMethodology.setId(id);
activityMethodology.setActivity(activity);
activityMethodology.setMethodology(existingMethodology);

activityMethodologyService.saveActivityMethodology(activityMethodology);
activityMethodologies.add(activityMethodology);
}
}

// Set the methodologies list in the Activity entity
activity.setMethodologies(activityMethodologies);

// Save the complete Activity with all relationships and return it
return this.saveActivity(activity);
}

Изменить 28.10.2024 Объекты:
Действие:
@Entity

@Table(name = "activities", uniqueConstraints = {
@UniqueConstraint(columnNames = {"activity_number"})
})
//@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "activityNumber")
public class Activity {

// @Id
// @GeneratedValue(strategy = GenerationType.AUTO)
// @Column(name = "id")
// private Long id; // Primary Key, auto-generated by the database

@Id
@Column(name = "activity_number")
private String activityNumber; // Activity Number

@Column(name = "title")
private String activityTitle; // Activity Title

@Column(name = "estimated_annual_average_greenhouse_gas")
private BigDecimal estimatedAnnualAverageGreenhouseGas; // Estimated annual average greenhouse gas

@Column(name = "pdd_document_reference")
private String pddDocumentReference; // PDD Document Reference

@Column(name = "activity_type")
private String activityType; // Activity type (Possible values: "PoA", "Activity")

@Column(name = "scale")
private String scale; // Scale (Possible values: "Small", "Large")

@Column(name = "host_party_approved_for_transition")
private Boolean hostPartyApprovedForTransition; // Host Party Approved for Transition

@Column(name = "crediting_type")
private String creditingType; // Crediting Type (Possible values: "Renewable", "Fixed")

@Column(name = "current_crediting_period")
private Integer currentCreditingPeriod; // Current Crediting Period

@Column(name = "current_crediting_period_start_date")
private Date currentCreditingPeriodStartDate; // Current Crediting Period Start Date

@Column(name = "current_crediting_period_end_date")
private Date currentCreditingPeriodEndDate; // Current Crediting Period End Date

@Column(name = "effective_crediting_period_end_date")
private Date effectiveCreditingPeriodEndDate; // Effective Crediting Period End Date

@Column(name = "page_link_to_cdm_is")
private String pageLinkToCDMIS; // Page Link to CDM IS

@Column(name = "doe_registration")
private String doeRegistration; // DOE Registration

@Column(name = "cdm_registration_date")
private Date cdmRegistrationDate; // CDM Registration Date

@Column(name = "deregistration_date")
private Date deregistrationDate; // Deregistration Date

@Column(name = "mis_methodology")
private String misMethodology; // MIS Methodology (Date field)

@Column(name = "state")
private String state; // State of the project

@OneToMany(mappedBy = "activity", cascade = CascadeType.ALL, orphanRemoval = true)
private List cpas = new ArrayList();

@OneToMany(mappedBy = "activity", cascade = CascadeType.ALL, orphanRemoval = true)
//@JsonManagedReference(value = "activity-hostParty")
@JsonIgnoreProperties("activity")
private List activityHostParties = new ArrayList();

@OneToMany(mappedBy = "activity", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonBackReference
private List invoices = new ArrayList();

@ManyToMany( cascade = CascadeType.ALL)
@JoinTable(
name = "activity_focal_point",
joinColumns = @JoinColumn(name = "activity_id"),
inverseJoinColumns = @JoinColumn(name = "focal_point_id")
)
//@JsonBackReference(value = "focalPoint-activities")
private List focalPoints;

// @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
// @JoinColumn(name = "activity_id")
// private List methodologies;

@OneToMany(mappedBy = "activity", cascade = CascadeType.ALL, orphanRemoval = true)
private List scopes = new ArrayList();

// @ManyToMany(cascade = CascadeType.ALL)
// @JoinTable(
// name = "activity_methodology", // Name der Zwischentabelle
// joinColumns = @JoinColumn(name = "activity_id"), // Fremdschlüssel für Activity
// inverseJoinColumns = @JoinColumn(name = "methodology_id") // Fremdschlüssel für Methodology
// )
@ElementCollection
private List methodology = new ArrayList();

@OneToMany(mappedBy = "activity", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List activityHostPartyAddendums = new ArrayList();

@OneToMany(mappedBy = "activity", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List methodologies = new ArrayList();;

Методология
@Entity
@Table(name = "methodologies")

// , uniqueConstraints = {
// @UniqueConstraint(columnNames = {"methodologyName"})
// })
public class Methodology {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "methodology_id")
private UUID methodologyId;

@Column(name = "methodology_name")
private String methodologyName;

@Column(name = "methodology_version")
private String methodologyVersion;

@Column(name = "status")
private String status; // Possible values: "Active", "Inactive"

// @OneToMany(mappedBy = "methodology", cascade = CascadeType.ALL)
// private List activities = new ArrayList();
@ManyToMany
@JoinTable(
name = "methodology_scope",
joinColumns = @JoinColumn(name = "methodology_id"),
inverseJoinColumns = @JoinColumn(name = "scope_id")
)
private List scopes = new ArrayList();

// One-to-Many relationship between Methodology and ActivityMethodology
@OneToMany(mappedBy = "methodology", cascade = CascadeType.ALL)
private List activityMethodologies;

ActivityMethodology
@Entity
@Table(name = "activity_methodology")
public class ActivityMethodology {

@EmbeddedId
private ActivityMethodologyId id;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "activity_number_key", referencedColumnName = "activity_number", insertable = true, updatable = true)
private Activity activity;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "methodology_id_key", referencedColumnName = "methodology_id", insertable = true, updatable = true)
private Methodology methodology;


Подробнее здесь: https://stackoverflow.com/questions/791 ... -hibernate
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • TransientObjectException при сохранении ссылок на объекты в Hibernate
    Anonymous » » в форуме JAVA
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • TransientObjectException при сохранении ссылок на объекты в Hibernate
    Anonymous » » в форуме JAVA
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • TransientObjectException при сохранении ссылок на объекты в Hibernate
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • TransientObjectException при сохранении ссылок на объекты в Hibernate
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Удаление Entity после обновления до Hibernate 6.6.1.FINAL из 6.4.4.FINAL вызывает исключение TransientObjectException
    Anonymous » » в форуме JAVA
    0 Ответы
    64 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»