如何在CrudRepository中使用@SecondaryTable?

时间:2016-05-25 14:14:20

标签: spring spring-data spring-data-jpa

我使用Formsy.Form.prototype.validate = function(component) { console.log('test'); } 将bean架构映射到多个表:

SecondaryTable

然后我如何告诉spring创建一个使用表@Entity @Table(name = "address1") @SecondaryTables({ @SecondaryTable(name="address2") }) 中的值的Repository

address2

然后,我希望能够仅interface AddressRepository extends CrudRepository<Address, Long> { //this one uses address1 } 查询辅助表格。但是,我如何明确告诉spring使用上面的CrudRepository查询address2表?

(将address2-table视为一种归档表。只有在主address1-table中找不到地址,才应查询address2。)

2 个答案:

答案 0 :(得分:3)

我认为你误解了@SecondaryTable的用途。这是一种在不同数据库表之间拆分单个实体的方法。

来自文档(http://docs.oracle.com/javaee/7/api/javax/persistence/SecondaryTable.html

  

指定带注释的实体类的辅助表。指定   一个或多个辅助表指示实体的数据   class存储在多个表中。如果没有SecondaryTable   指定了注释,假定所有持久字段或   实体的属性映射到主表。如果不   指定了主键连接列,假定连接列   引用主表的主键列,并具有   与引用的主键列相同的名称和类型   主要表格。

您的注释在当前状态下表示存在Address实体,其中包含address1address2表中的数据,可以通过加入主键进行组合address1表格。

我认为,对于你想要做的事情,让它在不覆盖你的CrudRepository的情况下工作,就是使用不同的表格。如果我理解正确的话,你无论如何都需要查询这两个表。

答案 1 :(得分:3)

您可以使用SecondaryTable(如user和user_address表)表示两个表,这些表在一​​个实体中存储不同但相关的数据。您正在尝试将相同的数据存储在两个完全相同的不同表中。因此,SecondaryTable不适合您的需求。您应该将继承注释与每个类的策略表一起使用。这是一个例子;

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class AddressBase {
    ...
    ...
    ...
}

@Entity
@Table(name='address1')
public class Address1 extends AddressBase {}

@Entity
@Table(name='address2')
public class Address2 extends AddressBase {}

然后,您可以为每个实体编写存储库并执行您想要的任何操作。