我使用SecondaryTable
将bean模式映射到多个表:
@Entity
@Table(name = "address1")
@SecondaryTables({
@SecondaryTable(name="address2")
})
然后,我如何告诉spring创建一个使用表address2
中的值的Repository
?
interface AddressRepository extends CrudRepository<Address, Long> {
//this one uses address1
}
然后,我希望能够通过CrudRepository
仅查询辅助表。但是,我如何明确告诉spring使用上面的AddressRepository
查询address2
表?
(将address2表视为一种存档表。只有在主address1表中找不到地址时,才应查询address2)。
您可以使用类似于user和user_address表的SecondaryTable来表示在一个实体中存储不同但相关数据的两个表。您正在尝试将相同的数据存储在两个完全相同的不同表中。因此,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 {}
然后,您可以为每个实体编写存储库,并执行任何您想要的操作。
我想你误解了@SecondaryTable
的作用。这是一种在不同的数据库表中拆分单个实体的方法。
从文档(http://docs.oracle.com/javaee/7/api/javax/persistence/SecondaryTable.html)
为带注释的实体类指定辅助表。指定一个或多个辅助表指示实体的数据类存储在多个表中。如果没有SecondaryTable如果指定了注释,则假定所有持久字段或实体的属性被映射到主表。如果没有指定主键联接列,假定联接列引用主表的主键列,并具有与的引用主键列相同的名称和类型主表。
您的注释在其当前状态下表示存在一个Address
实体,其数据在address1
和address2
表中,可以通过连接address1
表的主键来组合。
我认为,您想要做的是只使用不同的表,并且在不覆盖CrudRepository
的情况下使其工作。如果我理解正确的话,您无论如何都需要查询这两个表。