我有以下场景
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
我有以下映射:
@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)
而我想要实现的是查询不同的表以检索两者Car和Bus实体.为此,我创建了以下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用于 …
通过将我的超类中的静态字段的属性设置为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
有人可以解释为什么在映射继承时,InheritanceType.TABLE_PER_CLASS无法使用GenerationType.AUTO策略生成主键值吗?
inheritance auto-generate hibernate-mapping table-per-class jpa-2.1
我正在使用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) 我们正在遗留数据库上创建一个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我们的基本表卡,确实有一个鉴别器字段,如果这可能有任何帮助.
我正在尝试使用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) 我正在尝试创建一系列对象,这些对象都存储在单独的表中,但是所有这些表上都有一组共同的字段。我希望 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
我正在使用Hibernate JPA.
假设我有这些类:
AbstractPerson
|--> ConcreteEmployee
|--> ConcreteCustomer
Run Code Online (Sandbox Code Playgroud)
有没有办法让具体类具有独立的ID?
我正在使用InheritanceType.TABLE_PER_CLASS.
我目前正在使用一个棕色数据库,该数据库包含一个表,其中包含3种不同类型的业务数据.它与SalesOrders和订单线有关.在旧的应用程序中,我们能够为每个销售订单添加3种类型的订单行:产品,小时费率和文本行.15年前,这是一个快速而肮脏的解决方案,可以在Delphi中轻松查询以获取一个数据网格中的所有行.一切
现在我尝试使用NHibernate在C#中构建对象模型.由于这三种线路类型没有真正的业务逻辑连接,我已经制作了3个没有基类的单独实体.但是,我想将这3种类型合并到一个列表中,以便我可以订购它们.
我已经考虑过使用inheritence,每个类的表,因为表符合要求(没有具有非空约束的列).这不是一个合乎逻辑的步骤,因为每种类型的业务完全不同(只有一些共同点是userId,description和remarks).也许是一个组件?但是如何将属性映射到3个不同的类而没有基类或除表名之外的任何类型的链接?
我希望你们明白我写的是什么.我还没有真正的代码,我只是在纸上写了一些关于如何处理这段代码的东西.
谁在这里可以帮助我的路上?
亲切的问候,泰德
table-per-class ×10
inheritance ×5
hibernate ×4
java ×3
jpa ×3
nhibernate ×2
.net ×1
annotations ×1
automapping ×1
c# ×1
components ×1
foreign-keys ×1
grails ×1
grails-orm ×1
jpa-2.1 ×1
union ×1