diff --git a/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/dto/usage/MeterReadingDto.java b/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/dto/usage/MeterReadingDto.java
index b508c22b..ed20abe9 100644
--- a/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/dto/usage/MeterReadingDto.java
+++ b/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/dto/usage/MeterReadingDto.java
@@ -19,17 +19,19 @@
package org.greenbuttonalliance.espi.common.dto.usage;
-import org.greenbuttonalliance.espi.common.dto.atom.LinkDto;
-
import jakarta.xml.bind.annotation.*;
-import java.time.OffsetDateTime;
-import java.util.List;
/**
* MeterReading DTO record for JAXB XML marshalling/unmarshalling.
- *
- * Represents a meter reading containing interval blocks and reading types.
- * Supports Atom protocol XML wrapping.
+ *
+ * Represents a meter reading - a set of values obtained from the meter.
+ * Per ESPI 4.0 specification, MeterReading extends IdentifiedObject but
+ * contains NO child elements. Relationships to ReadingType and IntervalBlock
+ * are expressed via Atom links, not embedded XML elements.
+ *
+ * Complies with espi.xsd MeterReading complexType definition.
+ *
+ * @see NAESB ESPI 4.0
*/
@XmlRootElement(name = "MeterReading", namespace = "http://naesb.org/espi")
@XmlAccessorType(XmlAccessType.FIELD)
diff --git a/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/mapper/usage/MeterReadingMapper.java b/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/mapper/usage/MeterReadingMapper.java
index 78acb60a..46e39986 100644
--- a/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/mapper/usage/MeterReadingMapper.java
+++ b/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/mapper/usage/MeterReadingMapper.java
@@ -22,24 +22,20 @@
import org.greenbuttonalliance.espi.common.domain.usage.MeterReadingEntity;
import org.greenbuttonalliance.espi.common.dto.usage.MeterReadingDto;
import org.greenbuttonalliance.espi.common.mapper.BaseIdentifiedObjectMapper;
-import org.greenbuttonalliance.espi.common.mapper.BaseMapperUtils;
import org.greenbuttonalliance.espi.common.mapper.DateTimeMapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
-import org.mapstruct.MappingTarget;
/**
* MapStruct mapper for converting between MeterReadingEntity and MeterReadingDto.
- *
- * Handles the conversion between the JPA entity used for persistence and the DTO
+ *
+ * Per ESPI 4.0 specification, MeterReading has NO child elements - only relationships
+ * expressed via Atom links. The DTO contains NO fields beyond id/uuid.
+ *
+ * Handles the conversion between the JPA entity used for persistence and the DTO
* used for JAXB XML marshalling in the Green Button API.
*/
-@Mapper(componentModel = "spring", uses = {
- DateTimeMapper.class,
- BaseMapperUtils.class,
- IntervalBlockMapper.class,
- ReadingTypeMapper.class
-})
+@Mapper(componentModel = "spring", uses = {DateTimeMapper.class})
public interface MeterReadingMapper {
/**
@@ -55,33 +51,21 @@ public interface MeterReadingMapper {
/**
* Converts a MeterReadingDto to a MeterReadingEntity.
- * Maps all related DTOs to their corresponding entities.
- *
+ * Since MeterReading has no child elements, only audit and relationship fields are managed.
+ *
* @param dto the meter reading DTO
* @return the meter reading entity
*/
@Mapping(target = "id", source = "uuid", qualifiedByName = "stringToUuid")
- @Mapping(target = "usagePoint", ignore = true)
- @Mapping(target = "readingType", ignore = true)
- @Mapping(target = "intervalBlocks", ignore = true)
- @Mapping(target = "relatedLinks", ignore = true)
- @Mapping(target = "selfLink", ignore = true)
- @Mapping(target = "upLink", ignore = true)
+ @Mapping(target = "created", ignore = true) // Audit field managed by persistence
+ @Mapping(target = "updated", ignore = true) // Audit field managed by persistence
+ @Mapping(target = "published", ignore = true) // Audit field managed by persistence
+ @Mapping(target = "description", ignore = true) // Managed separately
+ @Mapping(target = "selfLink", ignore = true) // Link managed separately
+ @Mapping(target = "upLink", ignore = true) // Link managed separately
+ @Mapping(target = "relatedLinks", ignore = true) // Links managed separately
+ @Mapping(target = "usagePoint", ignore = true) // Relationship managed separately
+ @Mapping(target = "readingType", ignore = true) // Relationship managed separately
+ @Mapping(target = "intervalBlocks", ignore = true) // Relationship managed separately
MeterReadingEntity toEntity(MeterReadingDto dto);
-
- /**
- * Updates an existing MeterReadingEntity with data from a MeterReadingDto.
- * Useful for merge operations where the entity ID should be preserved.
- *
- * @param dto the source DTO
- * @param entity the target entity to update
- */
- @Mapping(target = "id", ignore = true)
- @Mapping(target = "usagePoint", ignore = true)
- @Mapping(target = "readingType", ignore = true)
- @Mapping(target = "intervalBlocks", ignore = true)
- @Mapping(target = "relatedLinks", ignore = true)
- @Mapping(target = "selfLink", ignore = true)
- @Mapping(target = "upLink", ignore = true)
- void updateEntity(MeterReadingDto dto, @MappingTarget MeterReadingEntity entity);
}
\ No newline at end of file
diff --git a/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/repositories/usage/MeterReadingRepository.java b/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/repositories/usage/MeterReadingRepository.java
index 77419fb8..e9c92dce 100755
--- a/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/repositories/usage/MeterReadingRepository.java
+++ b/openespi-common/src/main/java/org/greenbuttonalliance/espi/common/repositories/usage/MeterReadingRepository.java
@@ -21,50 +21,20 @@
import org.greenbuttonalliance.espi.common.domain.usage.MeterReadingEntity;
import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
import java.util.List;
-import java.util.Optional;
import java.util.UUID;
@Repository
public interface MeterReadingRepository extends JpaRepository {
- // JpaRepository provides: save(), findById(), findAll(), deleteById(), etc.
-
- @Modifying
- @Transactional
- @Query("DELETE FROM MeterReadingEntity m WHERE m.id = :id")
- void deleteById(@Param("id") UUID id);
-
@Query("SELECT m.id FROM MeterReadingEntity m")
List findAllIds();
- // findById is already provided by JpaRepository
- // Optional findById(UUID id) is inherited
-
- // deleteById is already provided by JpaRepository
- // void deleteById(UUID id) is inherited
-
- // Custom method for createOrReplaceByUUID - should be implemented in service layer
-
- @Query("SELECT m FROM MeterReadingEntity m join m.relatedLinks link WHERE link.href = :href")
- List findByRelatedHref(@Param("href") String href);
-
- @Query("SELECT readingType FROM ReadingTypeEntity readingType WHERE readingType.selfLink.href in (:relatedLinkHrefs)")
- List