JPA Lots-to-Lots Combines a table object with the generated empty identifier composite key

These are my entities:

public class Account extends AbstractEntity<Long> { @Id @SequenceGenerator(name = "accountSequence", sequenceName = "SQ_ACCOUNTS", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "accountSequence") @Column(name = "ACC_ID", nullable = false) private Long id; ... } public class Integration extends AbstractEntity<Long> { @Id @SequenceGenerator(name = "integrationSequence", sequenceName="SQ_INTEGRATIONS", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "integrationSequence") @Column(name = "INT_ID", nullable = false) private Long id; ... public void addIntegration(Integration integration) { IntegrationAccount association = new IntegrationAccount(); // This does not help //association.setIntAccountsPK(new IntAccountsPK(integration.getId(), this.getId())); association.setAccount(this); association.setIntegration(integration); this.integrationAccounts.add(association); integration.getIntAccountsCollection().add(association); } } 

And this is the entity for the join table

 @Entity @Table(name = "INT_ACCOUNTS") public class IntegrationAccount { @EmbeddedId protected IntAccountsPK intAccountsPK; @JoinColumn(name = "ACC_ID", referencedColumnName = "ACC_ID", insertable = false, updatable = false) @ManyToOne private Account account; @JoinColumn(name = "INT_ID", referencedColumnName = "INT_ID", insertable = false, updatable = false) @ManyToOne private Integration integration; ... } @Embeddable public class IntAccountsPK implements Serializable { @Column(name = "INT_ID", nullable = false) private Long intId; @Column(name = "ACC_ID", nullable = false) private Long accId; ... } 

And when I do:

 account.addIntegrations(integrations.getTarget()); account.setCustomer(customer); accountService.save(account); 

I got this in my journal Called: org.hibernate.id.IdentifierGenerationException: null id is generated for: class com.dhl.dcc.domain.IntegrationAccount

I don’t have much knowledge about this type of matching, can you tell me how to improve this matching (the entity for the join table must be saved) and how to save the account with the appropriate integration? Thanks.

+6
source share
2 answers

You can create an identifier field for your IntegrationAccount, and then create a unique constraint for your two fields.

 @Entity @Table(name = "INT_ACCOUNTS", uniqueConstraints=@UniqueConstraint (columnNames={"ACC_ID", "INT_ID"})) public class IntegrationAccount { @Id private Long id; @JoinColumn(name = "ACC_ID", referencedColumnName = "ACC_ID", insertable = false, updatable = false) @ManyToOne private Account account; @JoinColumn(name = "INT_ID", referencedColumnName = "INT_ID", insertable = false, updatable = false) @ManyToOne private Integration integration; ... } 

It works like a charm!

+1
source

I know that this question is already marked as resolved, but I do not agree with the accepted answer. This answer modifies the datamodel by adding a useless column (new identifier) ​​to the INT_ACCOUNTS table. There is another way to solve this problem in Hibernate without changing the datamodel:

 @Entity @Table(name = "INT_ACCOUNTS") public class IntegrationAccount implements Serializable { @Id @ManyToOne @JoinColumn(name = "INT_ID_FK") private Integration integration; @Id @ManyToOne @JoinColumn(name = "ACC_ID_FK") private Account account; } @Entity @Table(name = "INTEGRATIONS") public class Integration { @Id @SequenceGenerator(name = "integrationSequence", sequenceName = "SQ_INTEGRATIONS", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "integrationSequence") @Column(name = "INT_ID") private Long id; } @Entity @Table(name = "ACCOUNTS") public class Account { @Id @SequenceGenerator(name = "accountSequence", sequenceName = "SQ_ACCOUNTS", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "accountSequence") @Column(name = "ACC_ID") private Long id; } 
+9
source

All Articles