【问题标题】:JPA 1 relationship table, 2 independant classes using a common class with @OneToManyJPA 1 个关系表,2 个独立子句,使用带有 @OneToMany 的公共类
【发布时间】:2012-04-20 10:56:50
【问题描述】:

基本上,我想在公司和个人上添加地址。地址是独立的实体。

公司可以有一个地址上下文,它使用与个人地址上下文相同的地址实体

AddressContext 给出与个人相关的地址含义,例如“我的家庭地址”

java 类:

public class Address {
}

public class AddressContext {
    private Address address;
    private String name;
}

public class Individual {
   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   private Set<AddressContext> addresseContexts;
}

public class Company {
   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   private Set<AddressContext> addresseContexts;
}

需要的数据库地址_context数据库表

CREATE TABLE `address_Context` (
   `ID` bigint(20) NOT NULL AUTO_INCREMENT,
   'address_id bigint(20) NOT NULL, 
   'RELATED_ITEM_ID bigint(20) NOT NULL,
   'RELATED_ITEM_TYPE varchar(50) NOT NULL,
   'NAME' varchar(5) 
);

基本上有以下几种

1, 1, 1, Individual, 'John's House';
2, 2, 1, Company, 'Depoy';

实际发生的是正在创建单独的表

companies_address_contexts
individuals_address_contexts

以上可能吗?我也不想继承 AddressContext

提前致谢

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    您不想将特定地址限制为实体类型(个人/公司)。想想个体经营者使用他们的家庭地址作为他们的公司地址的(边缘)案例。或者将多租户单元转换为办公综合体的情况。您得到了要点 - 地址应该是完全独立的实体,您系统中的其他实体然后通过 关联表 引用这些实体。

    在您的情况下,无论如何都会生成关联表,您只需要进行一些小的重构即可在您的代码中使用它们(一种形式)。像这样的:

    @Entity
    public class Address {
        // address fields etc
    }
    
    @Entity
    public class Individual {
       @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
       @JoinTable(name = "individual_addresses", 
           joinColumns = { @JoinColumn(name = "individual_id", unique = true) }, 
           inverseJoinColumns = { @JoinColumn(name = "address_id") })
       private Set<Address> addresses;
    }
    
    @Entity
    public class Company {
       @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
       @JoinTable(name = "company_addresses", 
           joinColumns = { @JoinColumn(name = "company_id", unique = true) }, 
           inverseJoinColumns = { @JoinColumn(name = "address_id") })
       private Set<Address> addresses;
    }
    

    【讨论】:

    • 对不起,我应该给出一个更完整的例子。我的地址实际上是唯一的,并且通过 AddressContext 与公司/个人相关联。我已经更新了我的初始帖子
    猜你喜欢
    • 2018-04-03
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多