加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JPA多对多连接表实体,复合键“null id generated”

发布时间:2020-12-14 06:00:14 所属栏目:Java 来源:网络整理
导读:这是我的实体: public class Account extends AbstractEntityLong { @Id @SequenceGenerator(name = "accountSequence",sequenceName = "SQ_ACCOUNTS",allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "accountSequen
这是我的实体:
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",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);
    }
}

这是连接表的实体

@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",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;
...
}

当我这样做时:

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

我在日志中得到了这个
引起:org.hibernate.id.IdentifierGenerationException:为以下项生成的null id:class com.dhl.dcc.domain.IntegrationAccount

我对这种映射没有太多的了解,请你告诉我如何改进这种映射(必须保留连接表的实体)以及如何使用相关的集成来保存帐户?谢谢.

解决方法

您可以为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",updatable = false)
    @ManyToOne
    private Integration integration;
...
}

奇迹般有效!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读