Dom*_*ikM 6 java many-to-many hibernate jpa jointable
这是我的实体:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是连接表的实体
@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;
...
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时:
account.addIntegrations(integrations.getTarget());
account.setCustomer(customer);
accountService.save(account);
Run Code Online (Sandbox Code Playgroud)
我在我的日志中得到了这个引起的:org.hibernate.id.IdentifierGenerationException:为以下内容生成的null id:class com.dhl.dcc.domain.IntegrationAccount
我对这种映射没有太多的了解,请你告诉我如何改进这种映射(必须保留连接表的实体)以及如何使用相关的集成来保存帐户?谢谢.
我知道这个问题已被标记为已解决,但我不同意接受的答案.此答案通过在表中添加无用列(新id)来修改数据模型INT_ACCOUNTS.还有另一种方法可以在不修改数据模型的情况下在Hibernate中解决这个问题:
@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;
}
Run Code Online (Sandbox Code Playgroud)
小智 0
您可以为 IntegrationAccount 创建一个 ID 字段,然后为两个字段创建唯一约束。
@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;
...
}
Run Code Online (Sandbox Code Playgroud)
奇迹般有效!