标签: table-per-class

当基类在流畅的nhibernate中抽象时,如何实现每个具体类的表?

我有以下场景

public abstract class BaseClass
{
  public virtual int Id {get; set};
  public virtual string Name {get; set;}
}

public class FirstSubClass : BaseClass
{
   //properties and behaviour here
}

public class SecondSubClass : BaseClass
{
  //properties of SecondSubclass Here
}

public class ProcessStep
{
   public virtual IList<BaseClass> ContentElements {get; set;}  
}
Run Code Online (Sandbox Code Playgroud)

对于映射我使用了以下代码片段: -

this._sessionFactory =
                          Fluently.Configure().Database(SQLiteConfiguration.Standard
                          .ConnectionString(@"Data Source=SqliteTestSqlDataAccess.s3db;    Version=3; New=True; Pooling=True; Max Pool Size=1;"))
                          .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(assemblyWithDomainClasses).Conventions.Add(DefaultCascade.All())))
                          .ExposeConfiguration(BuildSchema)
                          .BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud)

默认情况下,fluent将忽略作为BaseClass的抽象基类.但是在ProcessStep类中有返回IList的属性ContentElements ,我得到一个异常: - NHibernate.MappingException:关联引用未映射的类:BaseClass

如果我使用IncludeBase(typeof(BaseClass))包含基类,那么它工作正常,但它为BaseClass和Derived类创建一个表,并且记录与FK-PK关系(每个子类的表 …

nhibernate abstract-class fluent-nhibernate automapping table-per-class

9
推荐指数
1
解决办法
2811
查看次数

具有不同Id名称的每类继承的JPA表

我有以下映射:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Vehicle {
    @Id
    @GeneratedValue
    Long id;
}

@Entity
@Table(name = "car")
@AttributeOverride(name = "id", column = @Column(name = "car_id"))
public class Car extends Vehicle {
}

@Entity
@Table(name = "bus")
@AttributeOverride(name = "id", column = @Column(name = "bus_id"))
public class Bus extends Vehicle {
}
Run Code Online (Sandbox Code Playgroud)

而我想要实现的是查询不同的表以检索两者CarBus实体.为此,我创建了以下Spring Data存储库

public interface VehicleRepository extends CrudRepository<Vehicle, Long> {
}
Run Code Online (Sandbox Code Playgroud)

并试着像这样使用它: vehicleRepository.findAll();

但是,在这种情况下,我得到了java.sql.SQLSyntaxErrorException: ORA-00904: "KEY": invalid identifier.好像使用@Inheritance连同@AttributeOverride用于 …

java hibernate jpa table-per-class spring-data-jpa

7
推荐指数
1
解决办法
1479
查看次数

使用Table Per Subclass时如何确保数据完整性?

通过将我的超类中的静态字段的属性设置为false,我在Grails中使用每个子类策略的.这样,Grails为我的超类创建了一个表,为每个子类创建了一个附加表.tablePerHierarchymapping

但是,虽然超类和子类记录共享相同的ID(主键),但没有外键约束来保持它们的一致性,即可以删除超类记录,使子类记录处于无效状态.我想知道是否有设置/属性使GORM以某种方式解决这个问题,例如通过约束.或者是我手动添加外键的唯一选择?


例如,给定以下域类作为超类:

class Product {
    String productCode

    static mapping = {
        tablePerHierarchy false
    }
}
Run Code Online (Sandbox Code Playgroud)

以下域类作为子类:

class Book extends Product {
    String isbn
}
Run Code Online (Sandbox Code Playgroud)

这导致创建两个表,即Product表和Book表.例如,当创建Book(通过脚手架页面)时,会在每个表中插入一条记录,它们唯一的链接就是每个表的ID值相同.具体来说,数据可能如下所示:

PRODUCT
Id      Version     ProductCode
1       1           BLAH-02X1

BOOK
Id      ISBN
1       123-4-56-7891011-1
Run Code Online (Sandbox Code Playgroud)

由于在数据库级别没有为这些表定义正式关系,因此可以删除其中一个记录并保留另一个记录,从而导致数据无效.显然我可以使用SQL在两个ID字段上手动创建外键约束,但我希望让Grails处理它.这可能吗?


使用Grails 2.2.1

grails inheritance foreign-keys grails-orm table-per-class

6
推荐指数
1
解决办法
2467
查看次数

JPA:为什么GenerationType.AUTO不能与InheritanceType.TABLE_PER_CLASS策略一起使用

有人可以解释为什么在映射继承时,InheritanceType.TABLE_PER_CLASS无法使用GenerationType.AUTO策略生成主键值吗?

inheritance auto-generate hibernate-mapping table-per-class jpa-2.1

6
推荐指数
0
解决办法
94
查看次数

JPA TABLE_PER_CLASS继承:如何只选择SELECT超类条目?

我正在使用EclipseLink作为JPA提供程序.此外,我正在使用以下TABLE_PER_CLASS继承结构

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@NamedQueries({
    @NamedQuery(name=Parent.QUERY_FIND_ALL, query="SELECT p FROM Parent p")
})
public class Parent {
        // the class code follows here
}

@javax.persistence.Entity 
@NamedQueries({
    @NamedQuery(name=Child.QUERY_FIND_ALL, query="SELECT c FROM Child c")
})

public class Child extends Parent {
        // the class code follows here
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是我只想接收父类的条目.但是使用命名查询"SELECT p FROM Parent p",也会返回子表中的所有条目.

选择或查找代码如下:

public List findWithNamedQuery(String query) {
        return em.createNamedQuery(query).getResultList();
}
Run Code Online (Sandbox Code Playgroud)

因此查询即"SELECT p FROM Parent p".

我怎样才能真正接收父条目而不是这个inheritacne层次结构的所有条目?

简而言之:如何保持所有子条目不受影响,并仅返回父条目?

编辑1:
我正在使用EclipseLink 2.0.1,但每次我通过类型表达式尝试axtavt的解决方案时,我都会收到以下错误:

"Invalid Type Expression on [my.domain.Parent].  The class does not have …
Run Code Online (Sandbox Code Playgroud)

inheritance jpa table-per-class

6
推荐指数
2
解决办法
8616
查看次数

EntityFramework(CodeFirst)继承映射:TPT和TPC的混合

我们正在遗留数据库上创建一个EntityFramework CodeFirst DAL (这意味着我们大多数时候都遇到了它的设计错误).

域模型(非常)简单:我们有抽象卡,子类型为HomeCard,CarCard,OwnerCard和RenterCard.确切地说:

abstract class Card {}
class HomeCard: Card {}
class CarCard: Card {}
class OwnerCard: Card {}
class RenterCard: Card {}
Run Code Online (Sandbox Code Playgroud)

数据库模型遵循表格卡片,家庭,汽车,所有者和租用者,其中卡片包含公共列,其他表格包含与特定类别相关的列.这正是TPT的意思,它完美映射到EntityFramework.

在重构之后,我们发现(并非出乎意料)Home和Car确实共享了一些属性,而Owner和Renter也是这样做的.并且它不仅仅是为了美观,而且一些功能将更容易实现(例如按名称搜索所有者租用者,或者由所有者搜索家庭卡片).所以我们希望我们的域模型看起来像这样:

abstract class Card {}
abstract class ProperyCard: Card {}
class HomeCard: ProperyCard {}
class CarCard: ProperyCard {}
abstract class PersonCard: Card {}
class OwnerCard: PersonCard {}
class RenterCard: PersonCard {}
Run Code Online (Sandbox Code Playgroud)

但是我们仍然有相同的数据库模型,这意味着我们在TPT和TPC之间有一些奇怪的组合.我们通过EF/CodeFirst映射它的所有尝试都失败了.有关使它工作的任何建议吗?

PS我们的基本表卡,确实有一个鉴别器字段,如果这可能有任何帮助.

.net entity-framework table-per-type table-per-class

5
推荐指数
1
解决办法
958
查看次数

Hibernate继承与不同的主键

我正在尝试使用TABLE_PER_CLASS策略创建继承,但我想为每个表创建不同的主键是否可能?

我有一个类Register,它有数百万个实例,其中一些实例是"特殊的",并且对于它们的列和额外的列有不同的规则.

@MappedSuperclass

public abstract class Register {


    @Id
    @Column(nullable = false, unique = true, updatable = false)
    private Long userId;


    private Date checked;

    @Column(nullable = false)
    private RegisterState tipo;
}


@Entity
@AttributeOverrides({ @AttributeOverride(name = "userId", column = @Column(nullable = false, unique = false, updatable = false)) })
public class PotencialRegister extends Register implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;


    @Column(length = 64, nullable = false, unique = false)
    private String referer;
}
Run Code Online (Sandbox Code Playgroud)

对于基本注册我不需要一个Id属性,因为我有一个独特的列,但该列不是唯一的专业机构,所以我增加了一个额外的属性.

问题是hibernate使用父id创建了一个复合主键(生成的模式是):

create table …
Run Code Online (Sandbox Code Playgroud)

java inheritance hibernate table-per-class mappedsuperclass

4
推荐指数
1
解决办法
857
查看次数

带有@MappedSuperclass 的休眠 TABLE_PER_CLASS 不会创建 UNION 查询

我正在尝试创建一系列对象,这些对象都存储在单独的表中,但是所有这些表上都有一组共同的字段。我希望 Hibernate 对所有这些表进行联合,但不包括超类作为表。

当我只用 @MappedSuperclass @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 注释超类时

...hibernate 将为超类的 (n) 个子类型分别运行 (n) 个查询。

当我删除@MappedSuperclass 并将@Entity 放在超类上时,Hibernate 将执行花哨的 UNION 查询,但将超类作为表包含在 UNION 中(超类没有表)。

如何在不使父类成为@Entity(因为它不是实体,因此没有表)的情况下将所有子类(不是单独的查询)一起使用 UNION?

union annotations hibernate table-per-class mappedsuperclass

4
推荐指数
1
解决办法
2321
查看次数

Java/Hibernate JPA:InheritanceType.TABLE_PER_CLASS和ID

我正在使用Hibernate JPA.

假设我有这些类:

AbstractPerson
|--> ConcreteEmployee
|--> ConcreteCustomer
Run Code Online (Sandbox Code Playgroud)

有没有办法让具体类具有独立的ID?

我正在使用InheritanceType.TABLE_PER_CLASS.

java hibernate jpa table-per-class

3
推荐指数
1
解决办法
7649
查看次数

使用方法:使用同一个表中的不同业务逻辑映射(NHibernate)多个类?

我目前正在使用一个棕色数据库,该数据库包含一个表,其中包含3种不同类型的业务数据.它与SalesOrders和订单线有关.在旧的应用程序中,我们能够为每个销售订单添加3种类型的订单行:产品,小时费率和文本行.15年前,这是一个快速而肮脏的解决方案,可以在Delphi中轻松查询以获取一个数据网格中的所有行.一切

现在我尝试使用NHibernate在C#中构建对象模型.由于这三种线路类型没有真正的业务逻辑连接,我已经制作了3个没有基类的单独实体.但是,我想将这3种类型合并到一个列表中,以便我可以订购它们.

我已经考虑过使用inheritence,每个类的表,因为表符合要求(没有具有非空约束的列).这不是一个合乎逻辑的步骤,因为每种类型的业务完全不同(只有一些共同点是userId,description和remarks).也许是一个组件?但是如何将属性映射到3个不同的类而没有基类或除表名之外的任何类型的链接?

我希望你们明白我写的是什么.我还没有真正的代码,我只是在纸上写了一些关于如何处理这段代码的东西.

谁在这里可以帮助我的路上?

亲切的问候,泰德

c# nhibernate inheritance components table-per-class

3
推荐指数
1
解决办法
1717
查看次数