I am trying to use the PartyId ( a value object) as Id in spring data JDBC. I am setting the value in PartyId (you can see in first screen shot below), but at time of inserting it gives following error.
Debug Screen shot of cause
Stack Trace
Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL
[INSERT INTO "party" ("currency_uom_id", "description", "party_id", "party_type_id", "status_id", "version") VALUES (?, ?, ?, ?, ?, ?)]; ERROR: null value in column "party_id" violates not-null constraint
Detail: Failing row contains (null, null, Organisation, USD, Enable, 1).; nested exception is org.postgresql.util.PSQLException: ERROR: null value in column "party_id" violates not-null constraint
Detail: Failing row contains (null, null, Organisation, USD, Enable, 1).
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:251) ~[spring-jdbc-5.3.5.jar:5.3.5]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) ~[spring-jdbc-5.3.5.jar:5.3.5]
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) ~[spring-jdbc-5.3.5.jar:5.3.5]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) ~[spring-jdbc-5.3.5.jar:5.3.5]
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:991) ~[spring-jdbc-5.3.5.jar:5.3.5]
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:356) ~[spring-jdbc-5.3.5.jar:5.3.5]
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:340) ~[spring-jdbc-5.3.5.jar:5.3.5]
at org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategy.insert(DefaultDataAccessStrategy.java:138) ~[spring-data-jdbc-2.1.6.jar:2.1.6]
at org.springframework.data.jdbc.core.JdbcAggregateChangeExecutionContext.executeInsertRoot(JdbcAggregateChangeExecutionContext.java:90) ~[spring-data-jdbc-2.1.6.jar:2.1.6]
at org.springframework.data.jdbc.core.AggregateChangeExecutor.execute(AggregateChangeExecutor.java:66) ~[spring-data-jdbc-2.1.6.jar:2.1.6]
... 96 common frames omitted
The error says , PartyId is null , which violets the db constraints.
Party Class as Aggregate Root
@AccessType(AccessType.Type.PROPERTY)
public class Party implements AggregateRoot {
//Business key Id;
@Id//Use by spring data jdbc
@Embedded(onEmpty = USE_NULL)
private PartyId partyId; // private String partyId - this is working (removing @Embedded also)
private String description;
@Embedded(onEmpty = USE_NULL)
private PartyTypeId partyTypeId;
@Embedded(onEmpty = USE_NULL)
private CurrencyUomId currencyUomId;
@Embedded(onEmpty = USE_NULL)
private StatusId statusId;
@Version
private long version;
/*private List<PartyAttributes> partyAttributes = new ArrayList<>();
private List<PartyCarrierAccount> partyCarrierAccounts = new ArrayList<>();*/
//Only package level access
public Party(PartyId partyId,String description,PartyTypeId partyTypeId,CurrencyUomId currencyUomId,StatusId statusId,List<PartyAttributes> partyAttributes,List<PartyCarrierAccount> partyCarrierAccounts){
this.partyId = partyId;
this.partyTypeId = partyTypeId;
this.currencyUomId = currencyUomId;
this.statusId = statusId;
}
The insert will work if I make partyId as String (private String partyId in Party class, obviously removing @Embeded annotation from partyId)