如何将@SecondaryTable与CrudRepository一起使用



我使用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实体,其数据在address1address2表中,可以通过连接address1表的主键来组合。

我认为,您想要做的是只使用不同的表,并且在不覆盖CrudRepository的情况下使其工作。如果我理解正确的话,您无论如何都需要查询这两个表。

最新更新