java - 使用 Hibernate 将一个实体映射到一张表的不同列

标签 java database hibernate jpa mapping

我有一个简单的银行应用程序,其中有帐户和交易实体。一个账户保留取款和存款交易(可以在两个账户之间或账户与ATM之间(相应字段将为空)。 我使用 @ManyToOne 和 @OneToMany 注释,并希望保存在 fromAccount 和 toAccount 字段的事务表 id-s 中,但我得到了一个异常,您可以在下面看到。我知道这是因为映射到同一字段(account_id)而发生的,但是如果我应该使用 id 字段,我该如何修复它? 我的代码示例:

public class Account {
@OneToMany(fetch = FetchType.LAZY,
        mappedBy = "fromAcc",
        cascade = CascadeType.ALL)
private List<Transaction> withdrawTransactions = new ArrayList<>();

@OneToMany(fetch = FetchType.LAZY,
        mappedBy = "toAcc",
        cascade = CascadeType.ALL)
private List<Transaction> depositTransactions = new ArrayList<>();

public class Transaction {
@ManyToOne
@JoinColumn(name = "account_id")
private Account fromAcc;
@ManyToOne
@JoinColumn(name = "account_id")
private Account toAcc;

我得到的异常:

 Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: BankAppSimple] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1012)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:938)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at bank.app.simple.util.JpaUtil.getEntMngFactoryInstance(JpaUtil.java:18)
at bank.app.simple.util.JpaUtil.createEntityManager(JpaUtil.java:30)
at bank.app.simple.daoimpl.ExchangeRateDaoImpl.isCurrencyExist(ExchangeRateDaoImpl.java:19)
at bank.app.simple.serviceimpl.ExchangeRateServiceImpl.addRate(ExchangeRateServiceImpl.java:19)
at bank.app.simple.Main.fillTables(Main.java:46)
at bank.app.simple.Main.main(Main.java:26)

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: bank.app.simple.entity.Transaction column: account_id (should be mapped with insert="false" update="false")
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:862)
at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:880)
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:902)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:634)
at org.hibernate.mapping.RootClass.validate(RootClass.java:267)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:343)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:461)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935)
... 9 more

最佳答案

我认为您忘记在 Transaction 实体中设置连接列。 只需将 FROM_ACC_COLUMNTO_ACC_COLUMN 替换为事务表中相应的列名称即可。

public class Transaction {

    @ManyToOne
    @JoinColumn(name = "FROM_ACC_COLUMN", referencedColumnName = "account_id")
    private Account fromAcc;

    @ManyToOne
    @JoinColumn(name = "TO_ACC_COLUMN", referencedColumnName = "account_id")
    private Account toAcc;

}

就我个人而言,在这种情况下我不会选择 CascadeType.ALL,而是尝试 {CascadeType.PERSIST, CascadeType.MERGE}

关于java - 使用 Hibernate 将一个实体映射到一张表的不同列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56870499/

相关文章:

java - 自定义 CursorAdapter 未填充 ListView

mysql - 更新mysql数据最快、最有效的方法

java - java中的MySQL数据库,连接太多

java - hibernate 搜索行为?

java - Dozer 无法将 Hibernate 的 persistentBag 映射到 List

java - 用点符号命名的 JPA 实体

java - 为什么我有来自 repo spring 的 HTTP 403?

database - 非规范化字段的命名约定

java - Hibernate多对一属性在通过id持久化时为null

java - Spring单例bean是线程安全的吗?